| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 | #include "stdafx.h"#include "ElementRangeDB.h"#include "ElementRangeTable.h"namespace OTSClassifyEngine{	CElementRangeDB::CElementRangeDB(CDBStoreBasePtr a_datastore)	{		m_tableInfo.reset(new CElementRangeTable());		myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo);	}	CElementRangeDB::~CElementRangeDB()	{	}	CElementRangeList CElementRangeDB::GetElementRangeListById(const long a_nSTDId, const long a_nElementSize)	{		CElementRangeList listElementRange;		if (!m_listSTDItem.empty())		{			for (auto& pSTDItem : m_listSTDItem)			{				if (pSTDItem->GetSTDId() == (DWORD)a_nSTDId && pSTDItem->GetElementRange() == a_nElementSize)				{					listElementRange = pSTDItem->GetElementRangeList();				}			}		}		else		{			// read element list			for (int i = 0; i < a_nElementSize; i++)			{				auto tableQuery = GetQueryById(a_nSTDId, i, a_nElementSize);				ASSERT(tableQuery);				if (!tableQuery)				{					return listElementRange;				}				CSTDItemPtr pItem = ReadSTDItem(tableQuery);				ASSERT(pItem);				if (!pItem)				{					return listElementRange;				}				CElementRangeList listElement = pItem->GetElementRangeList();				CElementRangePtr pElement = CElementRangePtr(new CElementRange(*listElement[0].get()));				listElementRange.push_back(pElement);			}		}		return listElementRange;	}	CSTDItemsList& CElementRangeDB::GetSTDItemList(const BOOL a_bForce/* = FALSE*/)	{		if (a_bForce)		{			m_listSTDItem.clear();		}		if (m_listSTDItem.size() == 0)		{			ReadSTDItemList();		}		return m_listSTDItem;	}		CDBTableBasePtr CElementRangeDB::GetTableInfo()	{		/*if (!m_tableInfo)		{			m_tableInfo.reset(new CElementRangeTable);		}*/		return m_tableInfo;	}	BOOL CElementRangeDB::Init(const BOOL a_bClean /*= FALSE*/)	{		return myDB->Init(a_bClean);	}	BOOL CElementRangeDB::CreateTable(const BOOL a_bForce /*= FALSE*/)	{		return myDB->CreateTable(a_bForce);	}	BOOL CElementRangeDB::DeleteTable()	{		return myDB->DeleteTable();	}	BOOL CElementRangeDB::RemoveAllRows()	{		return myDB->RemoveAllRows();	}	BOOL CElementRangeDB::IsDBExist()	{		return myDB->IsDBExist();	}	OTSSQLITE::CDBStoreBasePtr CElementRangeDB::GetDatastore()	{		return myDB->GetDatastore();	}	OTSSQLITE::CDBQueryBasePtr CElementRangeDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/)	{		return myDB->GetTableQuery(a_sOrderColumnName);	}	BOOL CElementRangeDB::ReadSTDItemList()	{		auto tableInfoPtr = GetTableInfo();		ASSERT(tableInfoPtr);		if (!tableInfoPtr)		{			return FALSE;		}		auto query = GetTableQuery();		ASSERT(query);		if (!query)		{			return FALSE;		}		m_listSTDItem = ReadSTDItemList(query);		return TRUE;	}	CSTDItemsList CElementRangeDB::ReadSTDItemList(CDBQueryBasePtr a_query)	{		CSTDItemsList listSTDItem;		int nRowId = 0;		int nWrongItems = 0;		while (!a_query->IsEOF())		{			auto STDItem = ReadSTDItem(a_query);	//current x-ray point					if (!STDItem)			{				LogErrorTrace(__FILE__, __LINE__, _T("Read xray point info item failed: row id: %d"), nRowId);				nWrongItems++;			}			else			{				if (!listSTDItem.empty())				{					int nSTDId = STDItem->GetSTDId();					CElementRangeList listElementNew = STDItem->GetElementRangeList();					int nIndex = 0;					for (auto Item : listSTDItem)					{						listSTDItem.erase(listSTDItem.begin() + nIndex);						if (Item->GetSTDId() == nSTDId)						{							CElementRangeList listElementOld = Item->GetElementRangeList();							for (auto pElement : listElementNew)							{								listElementOld.push_back(CElementRangePtr(new CElementRange(*pElement.get())));							}							STDItem->SetElementRangeList(listElementOld);							break;						}						nIndex++;					}				}				listSTDItem.push_back(STDItem);			}			a_query->NextRow();			nRowId++;		}		return listSTDItem;	}	CSTDItemPtr CElementRangeDB::ReadSTDItem(CDBQueryBasePtr a_query)	{		int nCol;		CSTDItemPtr pSTDItem(new CSTDItem());					int nRangeNum;		nCol = (int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN;		nRangeNum = a_query->GetColIntValue(nCol, -1);		pSTDItem->SetElementRange(nRangeNum);		int nSTDIdNow;		nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;		nSTDIdNow = a_query->GetColIntValue(nCol, -1);		pSTDItem->SetSTDId(nSTDIdNow);		CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());				int nRangeStart;		nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;		nRangeStart = a_query->GetColIntValue(nCol, -1);		int nRangeEnd;		nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;		nRangeEnd = a_query->GetColIntValue(nCol, -1);		CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());		pIntRange->SetStart(nRangeStart);		pIntRange->SetEnd(nRangeEnd);		pElementRange->SetRange(pIntRange);		CElementPtr pElement = CElementPtr(new CElement());		int nAtomNum;		nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;		nAtomNum = a_query->GetColIntValue(nCol, -1);		pElement->SetAtomNum(nAtomNum);				double dPercent;		nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;		dPercent = a_query->GetColFloatValue(nCol, -1);		pElement->SetPercentage(dPercent);		pElementRange->SetElement(pElement);		CElementRangeList listElementRange;		listElementRange.push_back(pElementRange);		a_query->NextRow();		int nSTDIdNew;		int nRowId = 0;		while (!a_query->IsEOF())		{			nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;			nSTDIdNew = a_query->GetColIntValue(nCol, -1);			if (nSTDIdNew == nSTDIdNow)			{				CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());				int nElementIndex;				nCol = (int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN;				nElementIndex = a_query->GetColIntValue(nCol, -1);				int nRangeStart;				nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;				nRangeStart = a_query->GetColIntValue(nCol, -1);				int nRangeEnd;				nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;				nRangeEnd = a_query->GetColIntValue(nCol, -1);				CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());				pIntRange->SetStart(nRangeStart);				pIntRange->SetEnd(nRangeEnd);				pElementRange->SetRange(pIntRange);				CElementPtr pElement = CElementPtr(new CElement());				int nAtomNum;				nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;				nAtomNum = a_query->GetColIntValue(nCol, -1);				pElement->SetAtomNum(nAtomNum);				double dPercent;				nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;				dPercent = a_query->GetColFloatValue(nCol, -1);				pElement->SetPercentage(dPercent);				pElementRange->SetElement(pElement);							listElementRange.push_back(pElementRange);				if (nElementIndex == nRangeNum - 1)				{					break;				}			}			else			{				continue;			}			a_query->NextRow();			nRowId++;		}		pSTDItem->SetElementRangeList(listElementRange);		return pSTDItem;	}	CDBQueryBasePtr CElementRangeDB::GetQueryById(const long a_nSTDId, const long a_nElementId, const long a_nElementNum)	{		CDBQueryBasePtr query;		auto datastorePtr = GetDatastore();		ASSERT(datastorePtr);		if (!datastorePtr)		{			return query;		}		auto tableInfoPtr = GetTableInfo();		ASSERT(tableInfoPtr);		if (!tableInfoPtr)		{			return query;		}		CString sSTDIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN);		CString sElementIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN);		CString sElementNumColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN);		CString sSQLCommand;		sSQLCommand.Format(_T("SELECT * FROM \'%s\' WHERE %s = %d AND %s = %d AND %s = %d;"),			(LPCTSTR)tableInfoPtr->GetTableName(),			(LPCTSTR)sSTDIdColumnName,			a_nSTDId,			(LPCTSTR)sElementIdColumnName,			a_nElementId,			(LPCTSTR)sElementNumColumnName,			a_nElementNum);		query = datastorePtr->QueryByCommand(sSQLCommand);		ASSERT(query);		if (!query || !query->IsValid())		{			LogErrorTrace(__FILE__, __LINE__, _T("Invalid quary command (%s)."), (LPCTSTR)sSQLCommand);			ASSERT(FALSE);			return (CDBQueryBasePtr());		}		// do the table related valid checking		if (query->GetColCount() != GetTableInfo()->GetColumnCount())		{			LogErrorTrace(__FILE__, __LINE__, _T("query col num value is %d, but not %d"), query->GetColCount(), GetTableInfo()->GetColumnCount());			ASSERT(FALSE);			return (CDBQueryBasePtr());		}		return query;	}}
 |