示例#1
0
/*************************************************************
 * another kind of function that return a set
 ************************************************************/
std::vector<QueryTuple*> SetFunFactory::funInstance(XSchema* _pSch, 
										            std::string& _cubeName, 
									                SetTypesec _typesec, 
									                std::vector<std::string>& theVector)
{
    int size = theVector.size();
    XCube* pCube = _pSch->getCube(_cubeName);
	vector<QueryMember*> QmemVector;
	vector<QueryTuple*> QtupleVector;
	
	switch(_typesec)
	{
		//函数Members的处理对象
		//对于[Time].[Time].[1995].[Q1].[Month].Members
		//theVector中应依次存有string:Time, Time, 1995, Q1, Month
	case Members:
		if (size == 0 )
		{
			cout<<"error! please input query information..."<<endl;
		}
		else if (size == 1) //由于现在还不支持多个Hierarchy,所以size 为1、2结果是一样的
		{   
			if ((theVector.at(0) == "Measures")||(theVector.at(0) == "measures"))
			{
				//元数据现在还没有支持默认度量,先以第一个度量为默认的
				vector<Measure*> vecMea = pCube->getMeasures();
				vector<Measure*>::iterator meaIterator;
				if (!vecMea.empty())
				{
					for (meaIterator = vecMea.begin(); meaIterator < vecMea.end(); meaIterator++)
					{
						std::auto_ptr<QueryMember>pMem(new QueryMember);
	                    
						pMem->setHierarchyName("Measures");
						pMem->setLevelName("Measures");
					    pMem->setVal((*meaIterator)->getName());

						QmemVector.push_back(pMem.release());
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
					}
				}
 				
 				return QtupleVector;
			} 
			else
			{
				Dimension* pDim = pCube->getDimension(theVector.at(0));
				if (!pDim)
				{
					cout<<"error! wrong dimension name...."<<endl;
				} 
				else
				{
					//是取默认Hierarchy
					//获得的QueryMember应该是最细粒度的所有的QueryMember
					//所以在这里要作笛卡儿积(并不算纯粹的笛卡儿积),见for循环
					vector< Hierarchy* > hieVector = pDim->getHierarchies();
					Hierarchy* pHie = hieVector.at(0);//取第一个为默认Hierarchy
								//首先把Member从数据库中load出来
					pHie->LoadMembers();
					string hierarcyName = pHie->getName();
					vector<string> vecLevelName;
					vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
					vector<Level*> vecLevel = pHie->getLeveles();
					int levelSize = vecLevel.size();
					Level* pLevel = vecLevel.at(levelSize-1);
					string levelName = pLevel->getName();
					vector<Member*> vecMem = pLevel->getMembers();
					vector<Member*>::iterator memIterator;
					for (memIterator = vecMem.begin(); memIterator < vecMem.end(); memIterator++)
					{
						string memberVal = (*memIterator)->getKey();
						vector<string> vecAncestorVal;
						vector<string> vecAncestorLevel;
						vector<Member*> vecParentMems;
						vector<Member*>::iterator pMemIterator;
						vecParentMems = (*memIterator)->getAllParents();
						for (pMemIterator = vecParentMems.begin(); pMemIterator < vecParentMems.end(); pMemIterator++)
						{
							string parentVal = (*pMemIterator)->getKey();
							Level* pLevel = (*pMemIterator)->getLevel();
							string parentLevel = pLevel->getName();
							vecAncestorVal.push_back(parentVal);
							vecAncestorLevel.push_back(parentLevel);
						}
						std::auto_ptr<QueryMember>p(new QueryMember);
						p->setHierarchyName(hierarcyName);
						p->setAncestorVals(vecAncestorVal);
						p->setAncestorLevels(vecAncestorLevel);
						p->setVal(memberVal);
						p->setLevelName(levelName);
						QmemVector.push_back(p.release());
					    std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					    QmemVector.pop_back();
					    QtupleVector.push_back(pTuple.release());
					}
				
				    pHie->CleanMembers();

 				    return QtupleVector;
				}
			}
		}
		else if (size == 2)
		{   
			string dimName = theVector.at(0);

			Dimension* pDim = pCube->getDimension(dimName);
			if (pDim == NULL)
			{
				cout<<"null point to dimension"<<endl;
			}
			Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			if (pHie == NULL)
			{
				cout<<"null point to Hierarchy"<<endl;
			}
			//首先把Member从数据库中load出来
			pHie->LoadMembers();
			string hierarcyName = pHie->getName();
			vector<string> vecLevelName;
			vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
			vector<Level*> vecLevel = pHie->getLeveles();
			int levelSize = vecLevel.size();
			Level* pLevel = vecLevel.at(levelSize-1);
			string levelName = pLevel->getName();
			vector<Member*> vecMem = pLevel->getMembers();
			vector<Member*>::iterator memIterator;
			for (memIterator = vecMem.begin(); memIterator < vecMem.end(); memIterator++)
			{
				string memberVal = (*memIterator)->getKey();
				vector<string> vecAncestorVal;
				vector<string> vecAncestorLevel;
				vector<Member*> vecParentMems;
				vector<Member*>::iterator pMemIterator;
				vecParentMems = (*memIterator)->getAllParents();
                for (pMemIterator = vecParentMems.begin(); pMemIterator < vecParentMems.end(); pMemIterator++)
                {
					string parentVal = (*pMemIterator)->getKey();
					Level* pLevel = (*pMemIterator)->getLevel();
					string parentLevel = pLevel->getName();
					vecAncestorVal.push_back(parentVal);
					vecAncestorLevel.push_back(parentLevel);
                }
				std::auto_ptr<QueryMember>p(new QueryMember);
				p->setHierarchyName(hierarcyName);
				p->setAncestorVals(vecAncestorVal);
				p->setAncestorLevels(vecAncestorLevel);
				p->setVal(memberVal);
				p->setLevelName(levelName);
				QmemVector.push_back(p.release());
			    std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
				
			pHie->CleanMembers();

 			return QtupleVector;
		} 
		else if(size == 3)
		{
			Dimension* pDim = pCube->getDimension(theVector.at(0));
			Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			//首先把Member从数据库中load出来
			pHie->LoadMembers();
			Level* pLevel = pHie->getLevel(theVector.at(2));

			vector<Member*> memVector1;
			memVector1 = pLevel->getMembers();
			if (memVector1.empty())
			{
				cout<<"empty member vector,do not get the members from database"<<endl;
			} 
			else{
				vector<Member*>::iterator theIterator;
				for (theIterator = memVector1.begin(); theIterator < memVector1.end(); theIterator++)
				{
					if (*theIterator == NULL)
					{
						cout<<"do not get the members from the database!"<<endl;
					}
					string QueryMemberVal = (*theIterator)->getKey();
					std::auto_ptr<QueryMember>pMem(new QueryMember);
					pMem->setVal(QueryMemberVal);
					pMem->setLevelName(theVector.at(2));
					pMem->setHierarchyName(theVector.at(1));
					QmemVector.push_back(pMem.release());
			        std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				
			    pHie->CleanMembers();

 			    return QtupleVector;
			}	
		}
		else//出现成员等于或多于一个的情况 eg. [Time].[Time].[1995].[Q1].[Month].Members
		{
             Dimension* pDim = pCube->getDimension(theVector.at(0));
			 Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			 //首先把Member从数据库中load出来
			 pHie->LoadMembers();
			 Level* pLevel = pHie->getLevel(theVector.at(size-1));
			 vector<Member*> memVector = pLevel->getMembers();
			 vector<Member*>::iterator theIterator;
			 for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
			{
				string QueryMemberVal = (*theIterator)->getKey();
                std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal(QueryMemberVal);
				pMem->setLevelName(theVector.at(size));
				pMem->setHierarchyName(theVector.at(1));
				vector<string> ancestorVals;				
                vector<string> ancestorLevles;
				for (int i = 2; i < size-1; i++)
				{
					vector<Level*> levelVec;
					levelVec = pHie->getLeveles();
					ancestorVals.push_back(theVector.at(i));
					Level* p = levelVec.at(i);
					ancestorLevles.push_back(p->getName());
				}
				pMem->setAncestorVals(ancestorVals);
				pMem->setAncestorLevels(ancestorLevles);
				QmemVector.push_back(pMem.release());
                std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
				
			pHie->CleanMembers();

 			return QtupleVector;
		}
	break;
 
	//函数AllMembers,参考SQL Server联机丛书
	//返回包含指定维度或级别的所有成员的集合,包括计算成员。
	//注:暂时不考虑计算成员的处理,此时功能和Members功能差不多
	case AllMembers:
		if (size == 0 )
		{
			cout<<"error! please input the query information!"<<endl;
		}
		else if (size == 1)
		{
			//取得默认Hierarchy
			//暂时只支持一个Hierarchy,即和维度名相同
			string dimensionName = theVector.at(0);
			
            string hierarchyName = dimensionName;
			std::auto_ptr<QueryMember>pMem(new QueryMember);
			pMem->setVal("All");
			pMem->setHierarchyName(hierarchyName);
			pMem->setLevelName("All");
			QmemVector.push_back(pMem.release());
            std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
		    QmemVector.pop_back();
			QtupleVector.push_back(pTuple.release());
				
 			return QtupleVector;
		} 	
		else if(size == 2)//[Time].[Time].AllMembers
		{
			string dimensionName = theVector.at(0);
            Dimension* pDim = pCube->getDimension(dimensionName);
			Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			std::auto_ptr<QueryMember>pMem(new QueryMember);
			pMem->setHierarchyName(pHie->getName());
			pMem->setLevelName("All");
			pMem->setVal("All");
			QmemVector.push_back(pMem.release());
			std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
			QmemVector.pop_back();
			QtupleVector.push_back(pTuple.release());

 			return QtupleVector;
		}
		else //[Time].[Time].[Year].AllMembers
		{
            Dimension* pDim = pCube->getDimension(theVector.at(0));
			 Hierarchy* pHie = pDim->getHierarchy(theVector.at(1));
			 Level* pLevel = pHie->getLevel(theVector.at(size-1));
			 vector<Member*> memVector = pLevel->getMembers();
			 vector<Member*>::iterator theIterator;
			 for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
			 {
				string QueryMemberVal = (*theIterator)->getKey();
                std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal(QueryMemberVal);
				pMem->setLevelName(theVector.at(size));
				pMem->setHierarchyName(theVector.at(1));
				vector<string> ancestorVals;				
                vector<string> ancestorLevles;
				for (int i = 2; i < size-1; i++)
				{
					vector<Level*> levelVec;
					levelVec = pHie->getLeveles();
					ancestorVals.push_back(theVector.at(i));
					Level* p = levelVec.at(i);
					ancestorLevles.push_back(p->getName());
				}
				pMem->setAncestorVals(ancestorVals);
				pMem->setAncestorLevels(ancestorLevles);
				QmemVector.push_back(pMem.release());
			    std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
				
			//pHie->CleanMembers();没有加载过member

 			return QtupleVector;
		}
	break;
	case Children:
		
		//注:JPivot里面是不可能出现这种情况的
		//因为一旦出现,JPivot会自动转化成加一个CurrentMember函数
		//如:[Time].Children会自动转变成[Time].CurrentMember.Children
		string dimName = "";
		string hieName = "";
		bool isall = false;
		if (size == 1)
		{
			cout<<"error! invalid using of Children"<<endl;

		} 
		else if(size == 2)
		{
			Dimension* pDim =NULL;
            Hierarchy* pHie = NULL;
			
			if (isDimHie(theVector.at(0)))
			{
				vector<string> temp = distinct(theVector.at(0));
				dimName = temp.at(0);
				pDim = pCube->getDimension(dimName);
				assert(pDim);
				hieName = temp.at(1);
				Hierarchy* pHie = pDim->getHierarchy(hieName);
				assert(pHie);
			}
			else
			{
				dimName = theVector.at(0);
 				pDim = pCube->getDimension(theVector.at(0));
				assert(pDim);
				pHie = pDim->getDefaultHierarchy();
				hieName = pHie->getName();
				assert(pHie);
			}
			assert(pHie);
			pHie->LoadMembers();
			
			
               		
			vector<Level*> levelVec = pHie->getLeveles();
			Level* pLevel1 = levelVec.at(0);//父member所在的level
			assert(pLevel1);
			string ancestorVal = theVector.at(1);
			string ancestorLevel = pLevel1->getName();
            vector<string> valVec;
			vector<string> theVec;
			valVec.push_back(ancestorVal);
            theVec.push_back(ancestorLevel);

			Level* pLevel2 = levelVec.at(1);//查询的member所在的level
			string QueryMemberLevel = pLevel2->getName();
//  		cout<<"value:"<<theVector.at(1)<<endl;
  		Member* pm = pLevel1->getMember(theVector.at(1),NULL);////////////////////////////////
			vector<Member*> memVec = pm->getChildrenMember();
		//cout<<QueryMemberLevel<<"  "<<memVec.size()<<endl;
			vector<Member*>::iterator memIterator;
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				string QueryMemberVal = (*memIterator)->getKey();
				
                std::auto_ptr<QueryMember>p(new QueryMember(dimName,hieName,QueryMemberLevel,QueryMemberVal,valVec,theVec,isall));
                QmemVector.push_back(p.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
			pHie->CleanMembers();
 			
 			return QtupleVector;               
		}

		else if (size >= 2)
		{
			Dimension* pDim = NULL;
			Hierarchy* pHie = NULL;
            if (isDimHie(theVector.at(0)))
			{
				vector<string> temp = distinct(theVector.at(0));
				dimName = temp.at(0);
			    pDim = pCube->getDimension(temp.at(0));
				assert(pDim);
				hieName = temp.at(1);
				pHie = pDim->getHierarchy(temp.at(1));
				assert(pHie);
			}
            else
			{
				dimName = theVector.at(0);

				pDim = pCube->getDimension(theVector.at(0));
				assert(pDim);
				
				pHie = pDim->getDefaultHierarchy();
			}
            assert(pHie);
			string hieName = pHie->getName();
			pHie->LoadMembers();
			
			vector<Level*> levelVec = pHie->getLeveles();
			//children members'level
			Level* pLevel = levelVec.at(size-1);
		
			vector<Level*> parentLevels;
            vector<Level*>::iterator levelIterator;

            parentLevels.assign(levelVec.begin(),levelVec.begin()+size-1);

			vector<string> ancestorVal;
			vector<string> ancestorLevel;
			for (int i = 1; i < size; i++)
			{

				ancestorVal.push_back(theVector.at(i));
			}

			for (levelIterator = parentLevels.begin(); levelIterator < parentLevels.end(); levelIterator++)
			{
				string ancestorLevelName = (*levelIterator)->getName();
				ancestorLevel.push_back(ancestorLevelName);
			} 
		
            string firstparentMemVal = theVector.at(1);

			Member* firstparentMem = parentLevels.at(0)->getMember(firstparentMemVal, NULL);

            Member* lastParentMem = NULL; 
			if (size == 2)
			{
				assert(firstparentMem);
                lastParentMem = firstparentMem; 
			}
		
			else
			{
				for(int n = 2; n < size; n++)
				{
					//cout<<"theVector.at(n)"<<theVector.at(n)<<endl;
					firstparentMem = parentLevels.at(n-1)->getMember(theVector.at(n), firstparentMem);
					assert(firstparentMem);
				}
			}				
			lastParentMem = firstparentMem;						 
	        assert(lastParentMem);
			vector<Member*> memVec = lastParentMem->getChildrenMember();

			vector<Member*>::iterator memIterator;
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				string QueryMemberVal = (*memIterator)->getKey();
				std::auto_ptr<QueryMember>ptr(new QueryMember);
				ptr->setVal(QueryMemberVal);
				ptr->setLevelName(pLevel->getName());
				ptr->setHierarchyName(hieName);
				ptr->setDimensionName(dimName);
				ptr->setAncestorVals(ancestorVal);
				ptr->setAncestorLevels(ancestorLevel);
				ptr->setIsAll(isall);
				QmemVector.push_back(ptr.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
		
			pHie->CleanMembers();

 			return QtupleVector;
 		}
		break;
	    //下一个函数起点
	}
}
示例#2
0
/*************************************************************
 * another kind of function that return a set
 ************************************************************/
std::vector<QueryTuple*> SetFunFactory::funInstance(XSchema* _pSch, 
										            std::string& _cubeName, 
									                SetTypesec _typesec, 
									                std::vector<std::string>& theVector,
													FunParam *param)
{
    int size = theVector.size();
    XCube* pCube = _pSch->getCube(_cubeName);
	vector<QueryMember*> QmemVector;
	vector<QueryTuple*> QtupleVector;

	string dimName = "";
	string hieName = "";			
	Dimension* pDim = NULL;
	Hierarchy* pHie = NULL;
				
	if (isDimHie(theVector.at(0)))
	{
		vector<string> temp = distinct(theVector.at(0));
		dimName = temp.at(0);
		pDim = pCube->getDimension(temp.at(0));
		assert(pDim);
		hieName = temp.at(1);
		pHie = pDim->getHierarchy(temp.at(1));
		assert(pHie);
	}
			  
	else
	{
		dimName = theVector.at(0);
		pDim = pCube->getDimension(theVector.at(0));
		assert(pDim);
		pHie = pDim->getDefaultHierarchy();
	}
	assert(pHie);
	hieName = pHie->getName();
	
	//首先把Member从数据库中load出来
	pHie->LoadMembers();
	
	switch(_typesec)
	{
		//函数Members的处理对象
		//对于[Time].[Time].[1995].[Q1].[Month].Members
		//theVector中应依次存有string:Time, Time, 1995, Q1, Month
	case Members:
		if (size == 0 )
		{
			cout<<"error! please input query information..."<<endl;
		}
		else if (size == 1) //由于现在还不支持多个Hierarchy,所以size 为1、2结果是一样的
		{   
			if ((theVector.at(0) == "Measures")||(theVector.at(0) == "measures"))
			{
				//元数据现在还没有支持默认度量,先以第一个度量为默认的
				vector<Measure*> vecMea = pCube->getMeasures();
				vector<Measure*>::iterator meaIterator;
				if (!vecMea.empty())
				{
					for (meaIterator = vecMea.begin(); meaIterator < vecMea.end(); meaIterator++)
					{
						std::auto_ptr<QueryMember>pMem(new QueryMember);
	                    
						pMem->setHierarchyName("Measures");
						pMem->setLevelName("Measures");
					    pMem->setVal((*meaIterator)->getName());

						QmemVector.push_back(pMem.release());
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
					}
				}
 				
 				return QtupleVector;
			} 
			else
			{
				string hierarcyName = pHie->getName();
				vector<string> vecLevelName;
	//			vector< vector<string> > memNameInLevels;//用于存储每个Level上成员名字的vector
				
				vector<Level*> vecLevel = pHie->getLeveles();

				Member* temp = (vecLevel.at(0)->getMembers()).at(0);//获取第一个级别第一个成员
				
				getDescendants(temp,dimName,hieName,QtupleVector); // 获取该成员的所有后代
				
				pHie->CleanMembers();
				return QtupleVector;
				
			}
		}

		else if (size == 2)
		{   
			
			Level* pLevel = pHie->getLevel(theVector.at(1));
			
			vector<Member *> memVector1 = pLevel->getMembers();
			if (memVector1.empty())
			{
				cout<<"empty member vector,do not get the members from database"<<endl;
			} 
			else
			{
				vector<Member*>::iterator theIterator;
				QueryMember *pMem;

				for (theIterator = memVector1.begin(); theIterator < memVector1.end(); theIterator++)
				{
					
				    pMem = DwMemToQryMem(*theIterator,dimName,hieName);
					QmemVector.push_back(pMem);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				
				pHie->CleanMembers();
				
				return QtupleVector;
			}	

		} 

		else if(size >= 3)  // [Time.Time].[Month].[Day].Members
		{
			cout<<"Members funtion error,too much member"<<endl;
			return 0;
		}

	break;
 
	//函数AllMembers,参考SQL Server联机丛书
	//返回包含指定维度或级别的所有成员的集合,包括计算成员。
	//注:暂时不考虑计算成员的处理,此时功能和Members功能差不多
	case AllMembers:
		if (size == 0 )
		{
			cout<<"error! please input the query information!"<<endl;
		}

		else
		{
			if (size == 1)
			{
				std::auto_ptr<QueryMember>pMem(new QueryMember);
				pMem->setVal("All");
				pMem->setDimensionName(dimName);    // add by eason
				pMem->setHierarchyName(hieName);
				pMem->setLevelName("All");
				QmemVector.push_back(pMem.release());
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
				return QtupleVector;
			} 	
		
			else if(size == 2)//[Time].[Quarter].AllMembers
			{
				pHie->LoadMembers();             //首先把Member从数据库中load出来 add by eason
				
				Level* pLevel = pHie->getLevel(theVector.at(size-1));
				vector<Member*> memVector = pLevel->getMembers();
				vector<Member*>::iterator theIterator;
				QueryMember *pMem;

				for (theIterator = memVector.begin(); theIterator < memVector.end(); theIterator++)
				{
					pMem = DwMemToQryMem(*theIterator,dimName,hieName);
					QmemVector.push_back(pMem);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				pHie->CleanMembers();  
				
				return QtupleVector;
			}
		
			else //[Time].[Year].[Month].AllMembers
			{
				cout<<"AllMembers funtion error,too much member"<<endl;
				return 0;
			}
		}
	break;

	case Children:
		{
		//注:JPivot里面是不可能出现这种情况的
		//因为一旦出现,JPivot会自动转化成加一个CurrentMember函数
		//如:[Time].Children会自动转变成[Time].CurrentMember.Children
		
		bool isall = false;
		if (size == 1)
		{
			cout<<"error! invalid using of Children"<<endl;

		} 

		else
		{			
			vector<Level*> levelVec = pHie->getLeveles();
			
			Member* mem = levelVec.at(0)->getMember(theVector.at(1), 0);
			
			for (int i = 1; i < size-1; i++)
			{
				mem = levelVec.at(i)->getMember(theVector.at(i+1), mem); 
			}
		
			vector<Member*> memVec = mem->getChildrenMember();

			vector<Member*>::iterator memIterator;
			QueryMember * ptr;
				
			for (memIterator = memVec.begin(); memIterator < memVec.end(); memIterator++)
			{
				ptr = DwMemToQryMem(*memIterator,dimName,hieName);
				QmemVector.push_back(ptr);
				std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
				QmemVector.pop_back();
				QtupleVector.push_back(pTuple.release());
			}
		
			pHie->CleanMembers();

 			return QtupleVector;
 		}
		
		break;
		
}
	    //下一个函数起点
		case Siblings:

			if(size >= 2){
				
				vector<Level*> levelVec = pHie->getLeveles();
				Level *pLevel = levelVec.at(0);
				
				Member* temp = levelVec.at(0)->getMember(theVector.at(1), 0);
								
				for (int i = 1; i < size-1; i++)
				{
					temp = levelVec.at(i)->getMember(theVector.at(i+1), temp); 
				    pLevel = levelVec.at(i);	//兄弟成员所在的level				
				}
								
				Member* pMem = temp->getParent();
								
				vector<Member *> memVec;
							
				if(!pMem)   //不存在父成员,如Time.1998
				{	
					memVec = pLevel->getMembers();
				}
								
				else
				{
					memVec = pMem->getChildrenMember();
				}
				
				vector<Member *>::iterator memIterator;
				QueryMember *ptr;
				
				for(memIterator = memVec.begin();memIterator != memVec.end();memIterator++)
				{
					ptr = DwMemToQryMem(*memIterator,dimName,hieName);
					QmemVector.push_back(ptr);
					std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));
					QmemVector.pop_back();
					QtupleVector.push_back(pTuple.release());
				}
				pHie->CleanMembers();
				
				return QtupleVector;
			}
			else 
			{
				cout<<"Siblings funtion error,too less member"<<endl;
				return 0;
			}
			
			break;	
	
			
	case Descendants:
		{	
			   

				Level *ancLevel;  //先代成员所在的level
				Level *decLevel;  //后代成员所在的level
				vector<Level*> levelVec = pHie->getLeveles();
				Member* ancMember = levelVec.at(0)->getMember(theVector.at(1), 0);
				
				//定位目标成员
				for (int i = 1; i < size-1; i++)
				{
					ancMember = levelVec.at(i)->getMember(theVector.at(i+1), ancMember); 
                    ancLevel = levelVec.at(i);
				}
				
				if(param->getHasIntParam() || param->getHasStrParam())
				{ 
					if(param->getHasIntParam())   //如果包含数字型参数
					{
						int num = param->getIntParam();
						decLevel = ancLevel;

						if(num>0)
						{
							// 定位目标级别
							for(int j=0;j<num;j++)
							{
								decLevel = decLevel ->getChildLevel();
								assert(decLevel);   //不存在该级别
							}
						}
					}
				
					if(param->getHasStrParam())  //如果包含字符型参数
					{
						char *str = param->getStrParam();
						// 定位目标级别
						decLevel = pHie->getLevel(str); 
						assert(decLevel);   //不存在该级别
					}

					vector<Member *> _mem = decLevel->getMembers();
					vector<QueryMember*> QmemVector;
					QueryMember* ancMem = DwMemToQryMem(ancMember,dimName,hieName);
					QueryMember* decMem;
				
					for(int i = 0; i< _mem.size(); i++)
					{
						decMem = DwMemToQryMem(_mem.at(i),dimName,hieName);
					
						//此处仍可改进,没必要遍历级别上的所有成员
						if(isAncestor(ancMem, decMem))
						{
							QmemVector.push_back(decMem);
							std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));	
							QmemVector.pop_back();
							QtupleVector.push_back(pTuple.release());
						}
					}
				}

				else         //如果不含参数
				{
					getDescendants(ancMember,dimName,hieName,QtupleVector);
				}

				pHie->CleanMembers();
				return QtupleVector;
		}
				break;

		case Ascendants:
		{			
					vector<Level*> levelVec = pHie->getLeveles();
					Member* decMember = levelVec.at(0)->getMember(theVector.at(1), 0);
					
					//定位目标成员
					for (int i = 1; i < size-1; i++)
					{
						decMember = levelVec.at(i)->getMember(theVector.at(i+1), decMember); 
						assert(decMember);
					}

					vector<QueryMember*> QmemVector;
					QueryMember * ancQryMem;
					Member* ancMember = decMember ;

					while(ancMember)
					{
						ancQryMem = DwMemToQryMem(ancMember,dimName,hieName);
						QmemVector.push_back(ancQryMem);
						std::auto_ptr<QueryTuple>pTuple(new QueryTuple(QmemVector));	
						QmemVector.pop_back();
						QtupleVector.push_back(pTuple.release());
						ancMember = ancMember->getParent();
					}

					pHie->CleanMembers();
					return QtupleVector;
		}
					break;
	}

}