1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "QueryEngine.h"
21 #include "DataReader.h"
23 SSMRESULT CQueryEngine::finalConstruct()
25 SSMRESULT res = SSM_E_FAIL;
29 m_pQueryEngineEvent = NULL;
31 SSM_CLEANUP_ASSERT(CreateInstance(OID_ITasker, (IBase **)&m_pTasker));
33 SSM_CLEANUP_ASSERT(CreateGlobalInstance(OID_IPropagationEngine, (IBase **)&m_pPropagationEngine));
39 void CQueryEngine::finalRelease()
41 m_pQueryEngineEvent = NULL;
45 for (std::map<int, IConditionedQuery *>::iterator itor = m_conditionedQueries.begin();
46 itor != m_conditionedQueries.end(); ++itor)
48 itor->second->deactivateTriggers();
49 SAFE_RELEASE(itor->second);
52 for (std::map<int, CContextQuery *>::iterator itor = m_contextQueries.begin();
53 itor != m_contextQueries.end(); ++itor)
55 //Token *root = itor->second->getRoot();
57 SAFE_DELETE(itor->second);
60 m_mtxQueries.unlock();
63 SSMRESULT CQueryEngine::processQueryResult(int userTriggerId,
64 std::vector<result_model> *result)
66 SSMRESULT res = SSM_E_FAIL;
67 ModelPropertyVec modelData;
68 std::vector<result_model> result_model_data_id;
70 std::vector<std::string> contextName;
71 IContextModel *temp_contextmodel = NULL;
72 IContextModel *temp_contextmodel2 = NULL;
74 intptr_t *pData = NULL;
76 CDataReader *pDataReader = NULL;
80 if (m_contextQueries.find(userTriggerId) == m_contextQueries.end())
82 SSM_CLEANUP_ASSERT(SSM_E_FAIL);
85 m_contextQueries[userTriggerId]->check_result_model();
86 m_contextQueries[userTriggerId]->return_contextName(&contextName);
87 m_contextQueries[userTriggerId]->return_modelID(&modelID);
89 for (unsigned int i = 0; i < modelID.size(); i++)
91 SSM_CLEANUP_ASSERT(m_pPropagationEngine->getContextModel(contextName.at(i), &temp_contextmodel2));
93 for (unsigned int j = 0 ; j < result->size() ; j++)
96 if (result->at(j).dataId.size() <= 0)
101 int modelid = modelID.at(i);
102 std::vector<int> dataid;
103 for (unsigned int k = 0 ; k < result->at(j).dataId.size() ; k++)
105 SSM_CLEANUP_ASSERT(m_pPropagationEngine->getContextModel(result->at(j).modelName,
106 &temp_contextmodel));
107 data = result->at(j).dataId.at(k);
109 if (modelID.at(i) < result->at(j).modelID )
111 SSM_CLEANUP_ASSERT(temp_contextmodel->getParentDataId(data, temp_contextmodel2, &data));
112 dataid.push_back(data);
114 else if (modelID.at(i) > result->at(j).modelID )
116 SSM_CLEANUP_ASSERT(temp_contextmodel->getChildDataId(data, temp_contextmodel2, &dataid));
120 dataid.push_back(data);
122 SAFE_RELEASE(temp_contextmodel);
125 m_contextQueries[userTriggerId]->integrate_result(&result_model_data_id, modelid, &dataid,
126 temp_contextmodel2->getModelName());
129 SAFE_RELEASE(temp_contextmodel2);
132 pDataReader = new CDataReader();
134 for (unsigned int i = 0; i < result_model_data_id.size(); i++)
136 std::vector<CModelData *> modelDataSet;
138 for (unsigned int j = 0; j < (result_model_data_id)[i].dataId.size(); j++)
140 CModelData *pModelData = NULL;
141 IContextModel *pCM = NULL;
142 ModelPropertyVec modelPropertyVec;
144 SSM_CLEANUP_ASSERT(m_pPropagationEngine->getContextModel((result_model_data_id)[i].modelName,
146 SSM_CLEANUP_ASSERT(pCM->getModelData((result_model_data_id)[i].dataId[j], &modelPropertyVec));
147 pModelData = new CModelData();
148 pModelData->setDataId((result_model_data_id)[i].dataId[j]);
149 for (ModelPropertyVec::iterator itor = modelPropertyVec.begin();
150 itor != modelPropertyVec.end(); ++itor)
152 pModelData->addModelData(itor->propertyName, itor->propertyValue);
155 modelDataSet.push_back(pModelData);
160 SSM_CLEANUP_ASSERT(pDataReader->addModelData((result_model_data_id)[i].modelName, &modelDataSet));
162 pData = new intptr_t [3];
163 pData[0] = EVENT_TYPE_OUTER;
164 pData[1] = userTriggerId;
165 pData[2] = reinterpret_cast<intptr_t>(pDataReader);
168 m_pTasker->addTask(this, (void *)pData);
173 m_mtxQueries.unlock();
174 SAFE_DELETE(pDataReader);
175 SAFE_RELEASE(temp_contextmodel);
176 SAFE_RELEASE(temp_contextmodel2);
180 SSMRESULT CQueryEngine::validateQueryResult(IConditionedQueryResult *pConditionedQueryResult,
181 std::vector<result_model> *resultData)
183 SSMRESULT res = SSM_E_FAIL;
184 IContextModel *pContextModel = NULL;
185 IConditionedModel *pConditionedModel = NULL;
187 for (unsigned int i = 0 ; i < pConditionedQueryResult->getConditionedModelCount() ; i++)
189 std::vector<int> temp_dataID;
190 result_model temp_result;
191 SSM_CLEANUP_ASSERT(pConditionedQueryResult->getConditionedContextModel(i, &pConditionedModel));
192 SSM_CLEANUP_ASSERT(pConditionedModel->getAffectedData(&temp_dataID));
194 if (temp_dataID.size() == 0)
199 SSM_CLEANUP_ASSERT(pConditionedModel->getBaseContextModel(&pContextModel));
200 temp_result.modelID = pContextModel->getModelId();
201 temp_result.dataId = temp_dataID;
202 temp_result.modelName = pContextModel->getModelName();
203 resultData->push_back(temp_result);
204 SAFE_RELEASE(pConditionedModel);
205 SAFE_RELEASE(pContextModel);
208 if (resultData->size() == pConditionedQueryResult->getConditionedModelCount())
218 SAFE_RELEASE(pConditionedModel);
219 SAFE_RELEASE(pContextModel);
223 SSMRESULT CQueryEngine::onConditionedQueryEvent(int userTriggerId,
224 IConditionedQueryResult *pConditionedQueryResult)
226 SSMRESULT res = SSM_E_FAIL;
227 std::vector<result_model> result;
229 SSM_CLEANUP_ASSERT(validateQueryResult(pConditionedQueryResult, &result));
230 SSM_CLEANUP_ASSERT(processQueryResult(userTriggerId, &result));
236 void CQueryEngine::onExecute(void *pArg)
238 intptr_t *pData = (intptr_t *)pArg;
242 case EVENT_TYPE_INNER:
243 processQueryResult(pData[1], (std::vector<result_model> *)pData[2]);
246 case EVENT_TYPE_OUTER:
247 if (m_pQueryEngineEvent != NULL)
249 m_pQueryEngineEvent->onQueryEngineEvent(pData[1], (IDataReader *)pData[2]);
258 void CQueryEngine::onTerminate(void *pArg)
260 intptr_t *pData = (intptr_t *)pArg;
261 std::vector<result_model> *pResult = NULL;
262 CDataReader *pDataReader = NULL;
266 case EVENT_TYPE_INNER:
267 pResult = (std::vector<result_model> *)pData[2];
268 SAFE_DELETE(pResult);
271 case EVENT_TYPE_OUTER:
272 pDataReader = (CDataReader *)pData[2];
273 SAFE_DELETE(pDataReader);
279 SAFE_ARRAY_DELETE(pData);
282 SSMRESULT CQueryEngine::executeContextQuery(std::string contextQuery, int *cqid)
284 SSMRESULT res = SSM_E_FAIL;
285 IConditionedQuery *pConditionedQuery = NULL;
286 IConditionedQueryResult *pConditionedQueryResult = NULL;
287 QueryCondition queryConditions;
288 CContextQuery *clsContextQuery = NULL;
290 CCQLParser cqlParser;
291 IContextModel::ActivationType queryCommandType;
293 if (!cqlParser.parse(contextQuery, &token))
295 SSM_CLEANUP_ASSERT(SSM_E_FAIL);
298 if (!cqlParser.check_grammer(&token))
300 SSM_CLEANUP_ASSERT(SSM_E_FAIL);
303 clsContextQuery = new CContextQuery();
304 SSM_CLEANUP_NULL_ASSERT(clsContextQuery);
305 SSM_CLEANUP_ASSERT(clsContextQuery->initialize(token));
306 clsContextQuery->make_QueryCondition(&queryConditions);
308 if (CCQLParser::tolower(token.child_token[0].name) == "subscribe")
310 queryCommandType = IContextModel::ACTIVATION_TYPE_SUBSCRIBE;
314 queryCommandType = IContextModel::ACTIVATION_TYPE_GET;
317 SSM_CLEANUP_ASSERT(m_pPropagationEngine->createConditionedQuery(queryCommandType,
318 &queryConditions, this, &pConditionedQuery));
321 pConditionedQuery->addRef();
322 m_conditionedQueries[m_cqid] = pConditionedQuery;
323 m_contextQueries[m_cqid] = clsContextQuery;
324 clsContextQuery = NULL; //Mark it NULL, so that it's not freed in CLEANUP.
325 m_mtxQueries.unlock();
327 if (pConditionedQuery->hasAllConditionedModels() == true)
329 std::vector<result_model> *pResult = NULL;
331 SSM_CLEANUP_ASSERT(pConditionedQuery->getConditionedQueryResult(&pConditionedQueryResult));
332 pResult = new std::vector<result_model>();
333 if (validateQueryResult(pConditionedQueryResult, pResult) == SSM_S_OK)
335 //We have valid data, let's deliver to application.
336 intptr_t *pData = new intptr_t [3];
337 pData[0] = EVENT_TYPE_INNER;
339 pData[2] = reinterpret_cast<intptr_t>(pResult);
341 m_pTasker->addTask(this, (void *)pData);
345 SAFE_DELETE(pResult);
346 if (queryCommandType == IContextModel::ACTIVATION_TYPE_GET)
348 //There is no valid data. let's request new one
349 SSM_CLEANUP_ASSERT(pConditionedQuery->activateTriggers(m_cqid));
355 if (queryCommandType == IContextModel::ACTIVATION_TYPE_GET)
357 //There is no models such name
358 SSM_CLEANUP_ASSERT(SSM_E_FAIL);
362 //Every subscribe command must request new data to models
363 if (queryCommandType == IContextModel::ACTIVATION_TYPE_SUBSCRIBE)
365 SSM_CLEANUP_ASSERT(pConditionedQuery->activateTriggers(m_cqid));
371 SAFE_RELEASE(pConditionedQuery);
372 SAFE_RELEASE(pConditionedQueryResult);
373 SAFE_DELETE(clsContextQuery);
377 //TODO: Registration with multiple instance support
378 SSMRESULT CQueryEngine::registerQueryEvent(IQueryEngineEvent *pQueryEngineEvent)
380 m_pQueryEngineEvent = pQueryEngineEvent;
384 SSMRESULT CQueryEngine::unregisterQueryEvent(IQueryEngineEvent *pQueryEngineEvent)
386 if (m_pQueryEngineEvent == pQueryEngineEvent)
388 m_pQueryEngineEvent = NULL;
395 SSMRESULT CQueryEngine::killContextQuery(int cqid)
397 SSMRESULT res = SSM_E_FAIL;
399 std::map<int, IConditionedQuery *>::iterator itorConditionedQueries;
400 std::map<int, CContextQuery *>::iterator itorContextQuries;
403 itorConditionedQueries = m_conditionedQueries.find(cqid);
404 itorContextQuries = m_contextQueries.find(cqid);
406 if (itorConditionedQueries != m_conditionedQueries.end())
408 SSM_CLEANUP_ASSERT(itorConditionedQueries->second->deactivateTriggers());
409 itorConditionedQueries->second->release();
410 m_conditionedQueries.erase(itorConditionedQueries);
413 if (itorContextQuries != m_contextQueries.end())
415 SAFE_DELETE(itorContextQuries->second);
416 m_contextQueries.erase(itorContextQuries);
420 m_mtxQueries.unlock();