2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * MessageQueryGenerator.cpp
19 * Created on: 2011. 10. 28.
23 #include "MessageQueryGenerator.h"
24 #include "API/Messaging/MessageFilterValidatorFactory.h"
25 #include "API/Messaging/ConversationFilterValidatorFactory.h"
27 #include <API/Messaging/IMessagingTypes.h>
28 #include <API/Messaging/log.h>
29 #include <Commons/Exception.h>
31 #include <emf-types.h>
33 #include <dpl/log/log.h>
36 using namespace TizenApis::Api::Tizen;
43 const std::string MessageQueryGenerator::STRING_MATCH_EXCACTLY = "EXACTLY";
44 const std::string MessageQueryGenerator::STRING_MATCH_CONTAINS = "CONTAINS";
45 const std::string MessageQueryGenerator::STRING_MATCH_STARTSWITH = "STARTSWITH";
46 const std::string MessageQueryGenerator::STRING_MATCH_ENDSWITH = "ENDSWITH";
47 // const std::string MessageQueryGenerator::STRING_MATCH_CASESENSITIVE = "CASESENSITIVE";
49 const std::string MessageQueryGenerator::STRING_WHERE = "WHERE ";
50 const std::string MessageQueryGenerator::STRING_SUFFIX = "";
51 const std::string MessageQueryGenerator::STRING_DIRECTION = "A.MSG_DIRECTION";
53 const int MessageQueryGenerator::MESSAGE_TYPE_NOT_INITIALIZED = -1;
55 MessageQueryGenerator::MessageQueryGenerator():m_messageType(MESSAGE_TYPE_NOT_INITIALIZED) {
56 m_query.append(getQueryPrefix());
65 MessageQueryGenerator::MessageQueryGenerator(const Api::Tizen::SortModePtr& sortMode, const long limit, const long offset):
66 m_messageType(MESSAGE_TYPE_NOT_INITIALIZED){
67 LogDebug("<<< limit:" << limit << ", offset:" << offset);
69 m_query.append(getQueryPrefix());
71 //TODO check sort mode validation
72 m_sortMode = sortMode;
81 MessageQueryGenerator::~MessageQueryGenerator() {
84 void MessageQueryGenerator::reset(QueryGeneratorMode mode){
86 m_queryVector.clear();
92 m_query.append(getQueryPrefix());
97 void MessageQueryGenerator::setEmailAttributeMap(){
101 std::pair<std::string, std::string>(
102 MessageFilterValidatorFactory::ATTRIBUTE_ID, "mail_id"));
104 std::pair<std::string, std::string>(
105 MessageFilterValidatorFactory::ATTRIBUTE_FOLDER, "mailbox_type"));
107 std::pair<std::string, std::string>(
108 MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP, "date_time"));
110 std::pair<std::string, std::string>(
111 MessageFilterValidatorFactory::ATTRIBUTE_FROM, "full_address_from"));
113 std::pair<std::string, std::string>(
114 MessageFilterValidatorFactory::ATTRIBUTE_TO, "full_address_to"));
116 std::pair<std::string, std::string>(
117 MessageFilterValidatorFactory::ATTRIBUTE_CC, "full_address_cc"));
119 std::pair<std::string, std::string>(
120 MessageFilterValidatorFactory::ATTRIBUTE_BCC, "full_address_bcc"));
122 std::pair<std::string, std::string>(
123 MessageFilterValidatorFactory::ATTRIBUTE_BODY, "preview_text")); //TODO check
125 std::pair<std::string, std::string>(
126 MessageFilterValidatorFactory::ATTRIBUTE_IS_READ, "mail_status")); //TODO 1:seen, 2:deleted, 4:flagged, 8:answered, 20:draft
128 std::pair<std::string, std::string>(
129 MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY, "priority"));
131 std::pair<std::string, std::string>(
132 MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT, "subject"));
134 std::pair<std::string, std::string>(
135 MessageFilterValidatorFactory::ATTRIBUTE_TYPE, "type"));
138 std::pair<std::string, std::string>(
139 ConversationFilterValidatorFactory::ATTRIBUTE_MESSAGE_COUNT, "thread_item_count"));
142 void MessageQueryGenerator::setSmsMmsAttributeMap(){
144 attributeMap.clear();
147 std::pair<std::string, std::string>(
148 MessageFilterValidatorFactory::ATTRIBUTE_ID, "A.MSG_ID"));
150 std::pair<std::string, std::string>(
151 MessageFilterValidatorFactory::ATTRIBUTE_FOLDER, "A.FOLDER_ID"));
153 std::pair<std::string, std::string>(
154 MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP, "A.DISPLAY_TIME"));
155 //TODO check sms mms attribute frome, to, cc, bcc
157 std::pair<std::string, std::string>(
158 MessageFilterValidatorFactory::ATTRIBUTE_FROM, "B.ADDRESS_VAL"));
160 std::pair<std::string, std::string>(
161 MessageFilterValidatorFactory::ATTRIBUTE_TO, "B.ADDRESS_VAL"));
162 // attributeMap.insert(
163 // std::pair<std::string, std::string>(
164 // MessageFilterValidatorFactory::ATTRIBUTE_CC, "full_address_cc"));
165 // attributeMap.insert(
166 // std::pair<std::string, std::string>(
167 // MessageFilterValidatorFactory::ATTRIBUTE_BCC, "full_address_bcc"));
169 std::pair<std::string, std::string>(
170 MessageFilterValidatorFactory::ATTRIBUTE_BODY, "A.MSG_TEXT"));
172 std::pair<std::string, std::string>(
173 MessageFilterValidatorFactory::ATTRIBUTE_IS_READ, "A.READ_STATUS")); //TODO 1:seen, 2:deleted, 4:flagged, 8:answered, 20:draft
175 std::pair<std::string, std::string>(
176 MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY, "A.PRIORITY"));
178 std::pair<std::string, std::string>(
179 MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT, "A.SUBJECT"));
181 std::pair<std::string, std::string>(
182 MessageFilterValidatorFactory::ATTRIBUTE_TYPE, "A.MAIN_TYPE"));
187 void MessageQueryGenerator::initAttributeMap(){
190 LogDebug("MODE_EMAIL");
191 setEmailAttributeMap();
194 LogDebug("MODE_SMS_MMS");
195 setSmsMmsAttributeMap();
197 default: //TODO throw exception
202 void MessageQueryGenerator::visitPreComposite(Api::Tizen::FilterType& type, int depth){
204 m_queryVector.push_back("(");
208 void MessageQueryGenerator::visitInComposite(Api::Tizen::FilterType& type, int depth){
211 if(m_typeProcessing == 1){
212 m_typeProcessing = 0;
214 if(type != INTERSECTION_FILTER){
215 LogError("[ERROR] >>> invalid Filter type:" << type);
216 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
223 if(type == INTERSECTION_FILTER){
224 m_queryVector.push_back("AND");
226 // else if(type == UNION_FILTER){
227 // m_queryVector.push_back("OR");
230 LogError("[ERROR] invalid Filter type:" << type);
231 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
237 void MessageQueryGenerator::visitPostComposite(Api::Tizen::FilterType& type, int depth){
239 if(m_typeProcessing == 1){
240 m_typeProcessing = 0;
241 m_queryVector.erase(m_queryVector.end());
245 m_queryVector.push_back(")");
249 std::string MessageQueryGenerator::convertToEmfAttrName(std::string attrName){
250 LogDebug("<<< attrName:[" << attrName << "]");
252 std::string retString;
254 std::map<std::string, std::string>::iterator it = attributeMap.find(attrName);
255 if(it == attributeMap.end()){
256 MsgLogWanning("[WANNING] attribute not found : ["<< attrName << "]");
258 retString = static_cast<std::string>(attributeMap.find(attrName)->second);
261 LogDebug(">> retString:[" << retString << "]");
265 std::string MessageQueryGenerator::createTimeString(std::string& timeString)
267 LogDebug("<<< timeString:[" << timeString << "]");
269 size_t pos = timeString.find("-",0);
270 while(pos!= std::string::npos){
271 timeString.erase(pos,1);
272 pos = timeString.find('-',0);
275 LogDebug(">>> timeString:[" << timeString << "]");
279 std::string MessageQueryGenerator::createFolderType(std::string& value)
281 LogDebug("<<< value:[" << value << "]");
282 std::string retFolderType;
283 std::ostringstream outstream;
285 if(value.compare("INBOX") == 0){
286 outstream << EMF_MAILBOX_TYPE_INBOX;
287 }else if(value.compare("OUTBOX") == 0){
288 outstream << EMF_MAILBOX_TYPE_OUTBOX;
289 }else if(value.compare("DRAFTBOX") == 0){
290 outstream << EMF_MAILBOX_TYPE_DRAFT;
291 }else if(value.compare("SENTBOX") == 0){
292 outstream << EMF_MAILBOX_TYPE_SENTBOX;
294 LogDebug("[ERROR] unsupported type:["<< value << "]");
295 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid folder id");
298 retFolderType = outstream.str();
300 LogDebug(">>> retFolderType:[" << retFolderType << "]");
301 return retFolderType;
304 std::string MessageQueryGenerator::createPriorityTypeForEmail(std::string& value)
306 LogDebug("<<< value:[" << value << "]");
307 std::string retPriorityType;
309 if(value.compare("true")==0){
310 retPriorityType = "1";
312 retPriorityType = "3 OR priority=5";
315 return retPriorityType;
318 std::string MessageQueryGenerator::createPriorityTypeForSmsMms(std::string& value){
319 LogDebug("<<< value:[" << value << "]");
320 std::string retPriorityType;
322 if(value.compare("true")==0){
323 retPriorityType = "1";
324 }else if(value.compare("false")==0){
325 retPriorityType = "0";
327 LogError(">>> invalid value:[" << value << "]");
328 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "unsupported value");
331 return retPriorityType;
335 std::string MessageQueryGenerator::convertToTimeFormat(const std::string& timeString){
336 LogDebug("<<< timeString:[" << timeString << "]");
338 std::string retString;
339 retString.append("'");
343 retString.append(timeString.substr(0, yearLength));
344 retString.append("-");
345 nextStart = nextStart + yearLength;
348 retString.append(timeString.substr(nextStart, monthLength));
349 retString.append("-");
350 nextStart = nextStart + monthLength;
353 retString.append(timeString.substr(nextStart, dateLength));
354 retString.append(" ");
355 nextStart = nextStart + dateLength;
358 retString.append(timeString.substr(nextStart, hourLength));
359 retString.append(":");
360 nextStart = nextStart + hourLength;
362 int minuteLength = 2;
363 retString.append(timeString.substr(nextStart, minuteLength));
364 retString.append(":");
365 nextStart = nextStart + minuteLength;
367 int secondLength = 2;
368 retString.append(timeString.substr(nextStart, secondLength));
369 retString.append("'");
371 LogDebug(">>> retString:[" << retString << "]");
375 //convert from '20111115000000' to 2011-11-15 00:00:00
376 std::string MessageQueryGenerator::createDateTimeTypeForSmsMms(Api::Tizen::AnyPtr& value){
377 LogDebug("<<< value:[" << value->toString() << "]");
379 std::string tmpValueString = value->toString();
380 std::string secondsSinceType;
381 secondsSinceType.append("strftime('%s', "); //SQL time format function
382 if(m_mode == MODE_SMS_MMS){
383 tmpValueString = convertToTimeFormat(tmpValueString);
386 secondsSinceType.append(tmpValueString);
387 secondsSinceType.append(")");
389 LogDebug(">>> retPriorityType:[" << secondsSinceType << "]");
390 return secondsSinceType;
393 std::string MessageQueryGenerator::createDateTimeTypeForEmail(Api::Tizen::AnyPtr& value)
395 LogDebug("<<< value:[" << value->toString() << "]");
397 if(value->getType() != PrimitiveType_Time){
398 LogError("[ERROR]>> invalid type");
402 std::string retPriorityType;
403 retPriorityType = value->toString();
405 return retPriorityType;
408 std::string MessageQueryGenerator::convertBooleanStringToIntegerString(std::string& booleanString){
409 std::string retString;
411 if(booleanString.compare("true") == 0){
413 }else if(booleanString.compare("false") == 0){
416 LogError("invalid booleanString:[" << booleanString << "]");
417 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid booleanString :[" + booleanString + "]");
422 std::string MessageQueryGenerator::getMatchExactlyClause(std::string& attrName, Api::Tizen::AnyPtr& value)
424 std::string retClause;
425 std::string valueString = value->toString();
426 std::string emfAttributeName = convertToEmfAttrName(attrName);
429 if(m_mode == MODE_EMAIL){
430 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
431 retClause = emfAttributeName + " LIKE '%%<" + valueString +">'";
433 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
434 retClause = emfAttributeName + "=" + createDateTimeTypeForEmail(value);
436 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY)==0){
437 retClause = emfAttributeName + "=" + createPriorityTypeForEmail(valueString);
440 }else if(m_mode == MODE_SMS_MMS){
441 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
442 retClause = "("+emfAttributeName + " ='"+ valueString + "' AND " + getMessageDirectionString() + "=1)";
444 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
445 retClause = "("+emfAttributeName + " ='"+ valueString + "' AND " + getMessageDirectionString() + "=0)";
447 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
448 retClause = emfAttributeName + "=" + createDateTimeTypeForSmsMms(value); //TODO need to check
450 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY)==0){
451 retClause = emfAttributeName + "=" + createPriorityTypeForSmsMms(valueString);
456 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_IS_READ)==0){
457 retClause = emfAttributeName + "=" + convertBooleanStringToIntegerString(valueString);
458 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FOLDER)==0){
459 retClause = emfAttributeName + "=" + createFolderType(valueString);
461 retClause = emfAttributeName + " = '" + value->toString() + "'"; //TODO need to check
468 std::string MessageQueryGenerator::getMatchStartsWithClause(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& value){
469 std::string retClause;
470 std::string valueString = value->toString();
471 std::string emfAttributeName = convertToEmfAttrName(attrName);
474 if(m_mode == MODE_EMAIL){
475 }else if(m_mode == MODE_SMS_MMS){
476 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
477 retClause.append("(" + emfAttributeName + " LIKE '" + value->toString() +
478 "%%' AND " + getMessageDirectionString() + "=1) ");
480 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
481 retClause.append("(" + emfAttributeName + " LIKE '" + value->toString() +
482 "%%' AND " + getMessageDirectionString() +"=0) ");
487 retClause.append(emfAttributeName + " LIKE '" + value->toString() +"%%'");
493 std::string MessageQueryGenerator::getMessageDirectionString(){
494 return MessageQueryGenerator::STRING_DIRECTION;
497 std::string MessageQueryGenerator::getMatchEndsWithClause(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& value){
498 std::string retClause;
499 std::string valueString = value->toString();
500 std::string emfAttributeName = convertToEmfAttrName(attrName);
503 if(m_mode == MODE_EMAIL){
504 }else if(m_mode == MODE_SMS_MMS){
505 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
506 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
507 "' AND "+ getMessageDirectionString() + "=1) ");
509 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
510 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
511 "' AND " + getMessageDirectionString() + "=0) ");
516 retClause.append(emfAttributeName + " LIKE '%%" + value->toString() +"'");
522 std::string MessageQueryGenerator::getMatchContainsClause(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& value){
523 std::string retClause;
524 std::string valueString = value->toString();
525 std::string emfAttributeName = convertToEmfAttrName(attrName);
528 if(m_mode == MODE_EMAIL){
529 }else if(m_mode == MODE_SMS_MMS){
530 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
531 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
532 "%%' AND " + getMessageDirectionString() + "=1) ");
534 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
535 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
536 "%%' AND " + getMessageDirectionString() + "=0) ");
541 retClause.append(emfAttributeName + " LIKE '%%" + value->toString() +"%%'");
547 void MessageQueryGenerator::visitAttribute(std::string& attrName,
548 Api::Tizen::AnyArrayPtr& values, std::string& matchFlag, bool caseSensitive, int depth){
549 LogDebug("<<< attrName:[" << attrName << "], matchFlag:[" << matchFlag << "]");
550 LogDebug("values->size():" << values->size());
552 Api::Tizen::FilterType filterType = UNION_FILTER;
554 if(matchFlag.compare("EXIST")==0){
555 //TODO implement for EXIST
556 }else if(values->size() == 1){
557 AnyPtr matchValue = values->at(0);
558 visitAttributeEach(attrName, matchValue, matchFlag, depth);
560 visitPreComposite(filterType, depth);
562 AnyArray::iterator iter;
563 for(iter=values->begin(); iter!= values->end(); iter++){
565 if(iter != values->begin()){
567 visitInComposite(filterType, depth);
570 AnyPtr matchValue = *iter;
571 visitAttributeEach(attrName, matchValue, matchFlag, depth);
574 visitPostComposite(filterType, depth);
579 int MessageQueryGenerator::convertMessageType(std::string& stringType){
580 LogDebug("<<< stringType:[" << stringType << "]");
582 int retMessageType = -1;
584 if(stringType.compare("tizen.sms") ==0){
585 retMessageType = Api::Messaging::SMS;
586 }else if(stringType.compare("tizen.mms") ==0){
587 retMessageType = Api::Messaging::MMS;
588 }else if(stringType.compare("tizen.email") ==0){
589 retMessageType = Api::Messaging::EMAIL;
591 MsgLogError("invalid type:[" << stringType << "]");
595 LogDebug(">>> retMessageType:" << retMessageType);
596 return retMessageType;
600 void MessageQueryGenerator::visitAttributeEach(std::string& attrName, Api::Tizen::AnyPtr& value, std::string& matchFlag, int depth){
601 LogDebug("<<< attrName:[" << attrName << "], value:[" << value->toString() << "]");
603 if(attrName.compare("type")==0){
604 m_typeProcessing = 1;
605 m_currentType = value->toString();
607 m_messageType = convertMessageType(m_currentType);
609 LogDebug(">>> skip type");
613 std::string emfAttributeName = convertToEmfAttrName(attrName);
615 // if(emfAttributeName == NULL){
616 // LogDebug(">>> emfAttributeName is NULL");
619 std::string tmpStringBuffer;
621 if(matchFlag.compare(STRING_MATCH_EXCACTLY) == 0){
622 LogDebug("STRING_MATCH_EXCACTLY");
623 tmpStringBuffer.append(getMatchExactlyClause(attrName, value));
624 }else if(matchFlag.compare(STRING_MATCH_CONTAINS) == 0){
625 LogDebug("STRING_MATCH_CONTAINS");
626 tmpStringBuffer.append(getMatchContainsClause(attrName, value));
627 }else if(matchFlag.compare(STRING_MATCH_STARTSWITH) == 0){
628 LogDebug("STRING_MATCH_STARTSWITH");
629 tmpStringBuffer.append(getMatchStartsWithClause(attrName, value));
630 }else if(matchFlag.compare(STRING_MATCH_ENDSWITH) == 0){
631 LogDebug("STRING_MATCH_ENDSWITH");
632 tmpStringBuffer.append(getMatchEndsWithClause(attrName, value));
634 LogDebug("[ERROR]invalid match flag[" << matchFlag << "]");
635 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid match flag:[" + matchFlag + "]");
637 // else if(iter->find(MATCH_CASESENSITIVE)){ //TODO check case sensitive
639 m_queryVector.push_back(tmpStringBuffer);
643 void MessageQueryGenerator::visitAttributeRange(std::string& attrName, Api::Tizen::AnyPtr& initialValue, Api::Tizen::AnyPtr& endValue, int depth) {
644 LogDebug("<<< sttrName:[" << attrName <<"]");
645 LogDebug("initialVAlue:[" << initialValue->toString() << "]");
646 LogDebug("endValue:[" << endValue->toString() << "]");
648 std::string tmpStringBuffer;
650 std::string emfAttributeName = convertToEmfAttrName(attrName);
651 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
652 if(m_mode == MODE_EMAIL){
653 tmpStringBuffer.append(emfAttributeName + " BETWEEN " + initialValue->toString() + " AND " + endValue->toString());
654 }else if(m_mode == MODE_SMS_MMS){
655 tmpStringBuffer.append(emfAttributeName + " BETWEEN " +
656 createDateTimeTypeForSmsMms(initialValue) + " AND " +
657 createDateTimeTypeForSmsMms(endValue));
661 m_queryVector.push_back(tmpStringBuffer);
665 std::string MessageQueryGenerator::getQueryFromVector()
667 std::string retString;
669 std::vector<string>::const_iterator it = m_queryVector.begin();
670 while(it != m_queryVector.end()){
671 retString.append(*it);
672 retString.append(" ");
676 LogDebug(">>> retString:" << retString);
680 std::string MessageQueryGenerator::getQuery(){
681 std::stringstream buffer;
683 m_query.append(getQueryFromVector());
685 if(m_query.compare(getQueryPrefix())==0){
688 if(m_sortMode != NULL){
689 std::string platformAttrName = convertToEmfAttrName(m_sortMode->getAttributeName());
690 std::string sortModeString;
691 if(m_sortMode->getOrder() == ASCENDING_SORT_ORDER){
692 sortModeString = "ASC";
694 sortModeString = "DESC";
697 buffer << " ORDER BY " << platformAttrName << " " << sortModeString;
699 buffer << " LIMIT " << m_offset << "," << m_limit;
703 m_query.append(getQuerySuffix());
704 m_query.append(buffer.str());
709 std::string MessageQueryGenerator::getQueryPrefix(){
710 return MessageQueryGenerator::STRING_WHERE;
713 std::string MessageQueryGenerator::getQuerySuffix(){
714 return MessageQueryGenerator::STRING_SUFFIX;
720 } //namespace Platform
721 } //namespace WrtPlugins