2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file ContactSearchEngine.cpp
20 * @author Kisub Song (kisubs.song@samsung.com)
25 #include "ContactSearchEngine.h"
32 #include <Commons/Exception.h>
34 #include "ContactObjectP2AConverter.h"
35 #include "ContactUtility.h"
37 #define _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter) \
39 if((errorCode = contacts_query_create(view_uri, &query)) != CONTACTS_ERROR_NONE) \
40 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")"); \
41 if((errorCode = contacts_filter_create(view_uri, &filter)) != CONTACTS_ERROR_NONE) \
42 ThrowMsg(PlatformException, "contacts_filter_create error : " << errorCode << " (" << __FUNCTION__ << ")"); \
45 #define _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result) \
47 if((errorCode = contacts_query_set_filter(query, filter)) != CONTACTS_ERROR_NONE) \
48 ThrowMsg(PlatformException, "contacts_query_set_filter error : " << errorCode << " (" << __FUNCTION__ << ")"); \
49 if((errorCode = contacts_db_get_records_with_query(query, 0, 0, &list)) != CONTACTS_ERROR_NONE) \
50 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")"); \
51 unsigned int record_count = 0; \
52 if((errorCode = contacts_list_get_count(list, &record_count)) != CONTACTS_ERROR_NONE) \
53 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")"); \
54 contacts_list_first(list); \
55 for(unsigned int i=0; i<record_count; i++) { \
56 contacts_record_h record; \
57 if((errorCode = contacts_list_get_current_record_p(list, &record)) != CONTACTS_ERROR_NONE) \
58 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")"); \
60 if((errorCode = contacts_record_get_int(record, property_contact_id, &value)) != CONTACTS_ERROR_NONE) \
61 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")"); \
62 result->insert(value); \
63 contacts_list_next(list); \
66 contacts_list_destroy(list, true); \
68 contacts_filter_destroy(filter); \
70 contacts_query_destroy(query); \
77 using namespace WrtDeviceApis::Commons;
78 using namespace DeviceAPI::Tizen;
81 ContactSearchEngine::AttributePropertiesMap ContactSearchEngine::attributePropertiesMap = {
82 {"id", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_String } },
83 {"personId", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.person_id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_String } },
84 {"addressBookId", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.address_book_id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_String } },
85 {"lastUpdated", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.changed_time, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Time } },
86 {"isFavorite", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.is_favorite, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
87 {"name.prefix", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.prefix, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
88 {"name.suffix", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.suffix, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
89 {"name.firstName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.first, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
90 {"name.middleName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.addition, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
91 {"name.lastName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.last, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
92 {"name.nicknames", { _contacts_nickname._uri, _contacts_nickname.contact_id, _contacts_nickname.name, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
93 {"name.phoneticFirstName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.phonetic_first, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
94 {"name.phoneticLastName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.phonetic_last, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
95 {"name.displayName", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.display_name, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
96 {"addresses.country", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.country, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
97 {"addresses.region", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.region, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
98 {"addresses.city", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.locality, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
99 {"addresses.streetAddress", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.street, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
100 {"addresses.additionalInformation", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.extended, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
101 {"addresses.postalCode", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.postal_code, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
102 {"addresses.isDefault", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.is_default, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
103 {"addresses.types", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
104 {"photoURI", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.image_thumbnail_path, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
105 {"phoneNumbers.number", { _contacts_number._uri, _contacts_number.contact_id, _contacts_number.number, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
106 {"phoneNumbers.isDefault", { _contacts_number._uri, _contacts_number.contact_id, _contacts_number.is_default, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
107 {"phoneNumbers.types", { _contacts_number._uri, _contacts_number.contact_id, _contacts_number.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
108 {"emails.email", { _contacts_email._uri, _contacts_email.contact_id, _contacts_email.email, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
109 {"emails.isDefault", { _contacts_email._uri, _contacts_email.contact_id, _contacts_email.is_default, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
110 {"emails.types", { _contacts_email._uri, _contacts_email.contact_id, _contacts_email.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
111 {"birthday", { _contacts_event._uri, _contacts_event.contact_id, _contacts_event.date, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
112 {"anniversaries.date", { _contacts_event._uri, _contacts_event.contact_id, _contacts_event.date, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
113 {"anniversaries.label", { _contacts_event._uri, _contacts_event.contact_id, _contacts_event.label, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
114 {"organizations.name", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.name, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
115 {"organizations.department",{ _contacts_company._uri, _contacts_company.contact_id, _contacts_company.department, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
116 {"organizations.title", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.job_title, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
117 {"organizations.role", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.role, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
118 {"organizations.logoURI", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.logo, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
119 {"notes", { _contacts_note._uri, _contacts_note.contact_id, _contacts_note.note, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
120 {"urls.url", { _contacts_url._uri, _contacts_url.contact_id, _contacts_url.url, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
121 {"urls.type", { _contacts_url._uri, _contacts_url.contact_id, _contacts_url.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
122 {"ringtoneURI", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.ringtone_path, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
123 {"groupIds", { _contacts_group_relation._uri, _contacts_group_relation.contact_id, _contacts_group_relation.group_id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } }
126 ContactSearchEngine::ContactSearchEngine() :
128 m_isAddressBookIdSet(false),
129 m_isFilterSet(false),
130 m_isSortModeSet(false),
131 m_sortOrder(ASCENDING_SORT_ORDER)
135 ContactSearchEngine::~ContactSearchEngine()
139 void ContactSearchEngine::setAddressBookId(int id)
141 m_addressBookId = id;
142 m_isAddressBookIdSet = true;
145 void ContactSearchEngine::setCondition(FilterPtr filter)
150 IFilterVisitorPtr filterQuery = DPL::StaticPointerCast<IFilterVisitor>(SharedFromThis());
151 filter->travel(filterQuery);
153 if(m_filteredContactIds != NULL)
154 m_isFilterSet = true;
157 void ContactSearchEngine::setSortMode(SortModePtr attr)
162 m_sortOrder = attr->getOrder();
163 m_attributeNameForSort = attr->getAttributeName();
165 AttributePropertiesMap::iterator iter =
166 attributePropertiesMap.find(m_attributeNameForSort);
167 if(iter == attributePropertiesMap.end())
168 ThrowMsg(NotFoundException, "There is no attribute name for sorting : " << m_attributeNameForSort);
170 m_isSortModeSet = true;
173 ContactArrayPtr ContactSearchEngine::getContactSearchResult()
175 ContactArrayPtr result(NULL);
176 unsigned int length = 0;
183 ContactIdArrayPtr ids = ContactIdArrayPtr(new ContactIdArray());
185 AttributePropertiesMap::iterator iter =
186 attributePropertiesMap.find(m_attributeNameForSort);
187 AttributeProperties &property = iter->second;
189 length = m_filteredContactIds->size();
190 LogDebug("length : " << length);
194 sortContacts(property, ids, m_sortOrder, m_filteredContactIds);
195 result = getContacts(ids);
197 ContactArrayPtr contacts(new ContactArray());
203 length = m_filteredContactIds->size();
204 LogDebug("length : " << length);
207 result = getContacts(m_filteredContactIds);
209 ContactArrayPtr contacts(new ContactArray());
218 AttributePropertiesMap::iterator iter =
219 attributePropertiesMap.find(m_attributeNameForSort);
220 AttributeProperties &property = iter->second;
222 result = getAllContactsSorted(property, m_sortOrder);
226 result = getAllContacts();
234 void ContactSearchEngine::visitPreComposite(FilterType& type, int depth)
236 ContactIdSetArrayPtr idSets = ContactIdSetArrayPtr(new ContactIdSetArray());
238 m_contactIdSetArrayStack.push(idSets);
241 void ContactSearchEngine::visitInComposite(FilterType& type, int depth)
246 void ContactSearchEngine::visitPostComposite(FilterType& type, int depth)
248 ContactIdSetArrayPtr idSets = m_contactIdSetArrayStack.top();
249 m_contactIdSetArrayStack.pop();
251 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
253 if(type == UNION_FILTER)
254 getUnion(idSets, idSet);
255 else if(type == INTERSECTION_FILTER)
256 getIntersection(idSets, idSet);
260 m_filteredContactIds = idSet;
266 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
267 parentIdSets->push_back(idSet);
272 void ContactSearchEngine::visitAttribute(string& attrName, MatchFlag& matchFlag, AnyPtr& matchValue, int depth)
274 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
278 string value = matchValue->getString();
279 idSet->insert(ContactUtility::strToInt(value));
282 m_filteredContactIds = idSet;
285 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
286 parentIdSets->push_back(idSet);
291 else if(attrName == "addresses.types" ||
292 attrName == "emails.types" ||
293 attrName == "phoneNumbers.types" ||
294 attrName == "urls.type")
297 m_filteredContactIds = ContactIdSetPtr(NULL);
302 AttributePropertiesMap::iterator iter =
303 attributePropertiesMap.find(attrName);
304 if(iter == attributePropertiesMap.end())
305 ThrowMsg(NotFoundException, "There is no attribute name for filter : " << attrName);
306 AttributeProperties &properties = iter->second;
308 if(properties.type == ContactSvcPrimitiveType_Boolean)
310 bool value = matchValue->getBool();
312 queryAttributeBool(properties, idSet, value);
314 else if(properties.type == ContactSvcPrimitiveType_String)
316 string value = matchValue->getString();
317 contacts_match_str_flag_e flag = CONTACTS_MATCH_EXISTS;
319 if(matchFlag == MATCH_EXACTLY)
320 flag = CONTACTS_MATCH_EXACTLY;
321 else if(matchFlag == MATCH_FULLSTRING)
322 flag = CONTACTS_MATCH_FULLSTRING;
323 else if(matchFlag == MATCH_CONTAINS)
324 flag = CONTACTS_MATCH_CONTAINS;
325 else if(matchFlag == MATCH_STARTSWITH)
326 flag = CONTACTS_MATCH_STARTSWITH;
327 else if(matchFlag == MATCH_ENDSWITH)
328 flag = CONTACTS_MATCH_ENDSWITH;
329 else if(matchFlag == MATCH_EXISTS)
330 flag = CONTACTS_MATCH_EXISTS;
332 queryAttributeString(properties, idSet, flag, value.c_str());
334 else if(properties.type == ContactSvcPrimitiveType_Int)
339 value = ContactUtility::strToInt(matchValue->getString());
341 value = matchValue->getInt();
343 contacts_match_int_flag_e flag;
344 if(matchFlag == MATCH_EXISTS)
346 flag = CONTACTS_MATCH_GREATER_THAN_OR_EQUAL;
349 flag = CONTACTS_MATCH_EQUAL;
352 queryAttributeInt(properties, idSet, flag, value);
357 m_filteredContactIds = idSet;
363 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
364 parentIdSets->push_back(idSet);
369 void ContactSearchEngine::visitAttributeRange(string& attrName, AnyPtr& initialValue, AnyPtr& endValue, int depth)
371 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
373 bool initialValueIsSet = false;
374 bool endValueIsSet = false;
376 if(initialValue != NULL || initialValue->isNullOrUndefined())
377 initialValueIsSet = false;
379 if(endValue != NULL || endValue->isNullOrUndefined())
380 endValueIsSet = false;
382 if(!initialValueIsSet && !endValueIsSet)
385 m_filteredContactIds = ContactIdSetPtr(NULL);
393 m_filteredContactIds = idSet;
396 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
397 parentIdSets->push_back(idSet);
402 else if(attrName == "addresses.types" ||
403 attrName == "emails.types" ||
404 attrName == "phoneNumbers.types" ||
405 attrName == "urls.type")
408 m_filteredContactIds = ContactIdSetPtr(NULL);
413 AttributePropertiesMap::iterator iter =
414 attributePropertiesMap.find(attrName);
415 if(iter == attributePropertiesMap.end())
416 ThrowMsg(NotFoundException, "There is no attribute name for filter : " << attrName);
417 AttributeProperties &properties = iter->second;
419 if(properties.type == ContactSvcPrimitiveType_Boolean)
421 bool initialValueBool = false;
422 bool endValueBool = false;
424 if(initialValueIsSet)
425 initialValueBool = initialValue->getBool();
427 endValueBool = endValue->getBool();
429 queryAttributeRangeBool(properties, idSet, initialValueIsSet, initialValueBool, endValueIsSet, endValueBool);
431 else if(properties.type == ContactSvcPrimitiveType_String)
433 const char *initialValueCStr = NULL;
434 const char *endValueCStr = NULL;
436 string initialValueStr;
439 if(initialValueIsSet)
441 initialValueStr = initialValue->getString();
442 initialValueCStr = initialValueStr.c_str();
446 endValueStr = endValue->getString();
447 endValueCStr = endValueStr.c_str();
450 queryAttributeRangeString(properties, idSet, initialValueCStr, endValueCStr);
452 else if(properties.type == ContactSvcPrimitiveType_Int)
454 int initialValueInt = 0;
459 if(initialValueIsSet)
460 initialValueInt = ContactUtility::strToInt(initialValue->getString());
462 endValueInt = ContactUtility::strToInt(endValue->getString());
466 if(initialValueIsSet)
467 initialValueInt = initialValue->getInt();
469 endValueInt = endValue->getInt();
472 queryAttributeRangeInt(properties, idSet, initialValueIsSet, initialValueInt, endValueIsSet, endValueInt);
477 m_filteredContactIds = idSet;
481 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
482 parentIdSets->push_back(idSet);
486 ContactArrayPtr ContactSearchEngine::getAllContactsSorted(AttributeProperties& attributeProperties, bool is_ascending)
488 ContactArrayPtr contacts = ContactArrayPtr(new ContactArray());
490 ContactArrayPtr allContacts = getAllContacts();
491 ContactIdArrayPtr sortedIds = ContactIdArrayPtr(new ContactIdArray());
493 sortContacts(attributeProperties, sortedIds, is_ascending);
495 map<int,ContactPtr> contactMap;
497 ContactArray::iterator citer;
498 for(citer=allContacts->begin(); citer!=allContacts->end(); citer++)
500 ContactPtr contact = *citer;
501 int id = ContactUtility::strToInt(contact->getId());
502 contactMap.insert(pair<int,ContactPtr>(id, contact));
505 ContactIdArray::iterator iter;
506 for(iter=sortedIds->begin(); iter!=sortedIds->end(); iter++)
510 map<int,ContactPtr>::iterator idPair = contactMap.find(id);
511 if(idPair == contactMap.end())
513 LogWarning("no contact id : " << id);
516 contacts->push_back(idPair->second);
522 ContactArrayPtr ContactSearchEngine::getAllContacts()
526 ContactArrayPtr contacts(new ContactArray());
527 contacts_list_h list = NULL;
529 LogDebug("start : " << m_isAddressBookIdSet);
531 if(!m_isAddressBookIdSet)
533 errorCode = contacts_db_get_all_records(_contacts_contact._uri, 0, 0, &list);
534 if(errorCode != CONTACTS_ERROR_NONE)
535 ThrowMsg(PlatformException, "contacts_db_get_all_records error : " << errorCode << " (" << __FUNCTION__ << ")");
539 contacts_query_h query = NULL;
540 contacts_filter_h filter = NULL;
542 errorCode = contacts_query_create(_contacts_contact._uri, &query);
543 if(errorCode != CONTACTS_ERROR_NONE)
544 ThrowMsg(PlatformException, "Fail to get contacts_query_create (ret:" << errorCode << ")");
546 errorCode = contacts_filter_create(_contacts_contact._uri, &filter);
547 if(errorCode != CONTACTS_ERROR_NONE)
548 ThrowMsg(PlatformException, "Fail to get contacts_filter_create (ret:" << errorCode << ")");
550 errorCode = contacts_filter_add_int(filter, _contacts_contact.address_book_id, CONTACTS_MATCH_EQUAL, m_addressBookId);
551 if(errorCode != CONTACTS_ERROR_NONE)
552 ThrowMsg(PlatformException, "Fail to get contacts_filter_add_int (ret:" << errorCode << ")");
554 errorCode = contacts_query_set_filter(query, filter);
555 if(errorCode != CONTACTS_ERROR_NONE)
556 ThrowMsg(PlatformException, "Fail to get contacts_query_set_filter (ret:" << errorCode << ")");
558 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
559 if(errorCode != CONTACTS_ERROR_NONE)
560 ThrowMsg(PlatformException, "Fail to get contacts_db_get_records_with_query (ret:" << errorCode << ")");
562 errorCode = contacts_filter_destroy(filter);
563 if(errorCode != CONTACTS_ERROR_NONE)
564 ThrowMsg(PlatformException, "Fail to get contacts_filter_destroy (ret:" << errorCode << ")");
566 errorCode = contacts_query_destroy(query);
567 if(errorCode != CONTACTS_ERROR_NONE)
568 ThrowMsg(PlatformException, "Fail to get contacts_query_destroy (ret:" << errorCode << ")");
571 unsigned int record_count = 0;
572 errorCode = contacts_list_get_count(list, &record_count);
573 if(errorCode != CONTACTS_ERROR_NONE)
574 ThrowMsg(PlatformException, "Fail to get contacts_list_get_count : " << errorCode << " (" << __FUNCTION__ << ")");
576 contacts_list_first(list);
577 for(unsigned int i=0; i<record_count; i++)
579 contacts_record_h record;
580 errorCode = contacts_list_get_current_record_p(list, &record);
581 if(errorCode != CONTACTS_ERROR_NONE || record == NULL)
583 LogWarning("contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
587 ContactPtr contact(NULL);
590 ContactObjectP2AConverterPtr contactObjConverter(
591 new ContactObjectP2AConverter(record, false));
593 contact = contactObjConverter->getAbstractContact();
597 LogWarning("fail to convert contact");
601 contacts->push_back(contact);
603 contacts_list_next(list);
607 contacts_list_destroy(list, true);
614 ContactArrayPtr ContactSearchEngine::getContacts(ContactIdArrayPtr& ids)
616 ContactArrayPtr contacts(new ContactArray());
618 ContactIdArray::iterator iter;
619 for(iter=ids->begin(); iter!=ids->end(); iter++)
623 ContactPtr contact = getContact(*iter);
625 contacts->push_back(contact);
629 LogWarning(_rethrown_exception.GetMessage());
637 ContactArrayPtr ContactSearchEngine::getContacts(ContactIdSetPtr& ids)
639 ContactArrayPtr contacts(new ContactArray());
641 ContactIdSet::iterator iter;
642 for(iter=ids->begin(); iter!=ids->end(); iter++)
646 ContactPtr contact = getContact(*iter);
648 contacts->push_back(contact);
652 LogWarning(_rethrown_exception.GetMessage());
659 ContactPtr ContactSearchEngine::getContact(int id)
662 contacts_record_h record = NULL;
664 errorCode = contacts_db_get_record(_contacts_contact._uri, id, &record);
665 if(errorCode != CONTACTS_ERROR_NONE)
667 LogError("No contact (id:" << id << ") : " << errorCode << " (" << __FUNCTION__ << ")");
668 return ContactPtr(NULL);
671 if(m_isAddressBookIdSet)
673 int addressBookId = 0;
675 errorCode = contacts_record_get_int(record, _contacts_contact.address_book_id, &addressBookId);
676 if(errorCode != CONTACTS_ERROR_NONE)
678 LogError("No contact (id:" << id << ") 2 : " << errorCode << " (" << __FUNCTION__ << ")");
679 return ContactPtr(NULL);
682 if(addressBookId != m_addressBookId)
683 return ContactPtr(NULL);
686 ContactObjectP2AConverterPtr contactObjConverter(
687 new ContactObjectP2AConverter(record, false));
688 ContactPtr contact = contactObjConverter->getAbstractContact();
693 void ContactSearchEngine::queryAttributeBool(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
696 const char* view_uri = attributeProperties.viewUri;
697 unsigned int property_contact_id = attributeProperties.propertyContactId;
698 unsigned int property_id = attributeProperties.propertyId;
701 contacts_query_h query = NULL;
702 contacts_filter_h filter = NULL;
703 contacts_list_h list = NULL;
705 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
707 errorCode = contacts_filter_add_bool(filter, property_id, match_value);
708 if(errorCode != CONTACTS_ERROR_NONE)
710 ThrowMsg(PlatformException, "contacts_filter_add_bool error : " << errorCode << " (" << __FUNCTION__ << ")");
713 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
716 void ContactSearchEngine::queryAttributeInt(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
717 contacts_match_int_flag_e match, int match_value)
719 const char* view_uri = attributeProperties.viewUri;
720 unsigned int property_contact_id = attributeProperties.propertyContactId;
721 unsigned int property_id = attributeProperties.propertyId;
724 contacts_query_h query = NULL;
725 contacts_filter_h filter = NULL;
726 contacts_list_h list = NULL;
728 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
730 errorCode = contacts_filter_add_int(filter, property_id, match, match_value);
731 if(errorCode != CONTACTS_ERROR_NONE)
733 ThrowMsg(PlatformException, "contacts_filter_add_int error : " << errorCode << " (" << __FUNCTION__ << ")");
736 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
739 void ContactSearchEngine::queryAttributeString(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
740 contacts_match_str_flag_e match, const char* match_value)
742 const char* view_uri = attributeProperties.viewUri;
743 unsigned int property_contact_id = attributeProperties.propertyContactId;
744 unsigned int property_id = attributeProperties.propertyId;
747 contacts_query_h query = NULL;
748 contacts_filter_h filter = NULL;
749 contacts_list_h list = NULL;
751 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
753 errorCode = contacts_filter_add_str(filter, property_id, match, match_value);
754 if(errorCode != CONTACTS_ERROR_NONE)
756 ThrowMsg(PlatformException, "contacts_filter_add_int error : " << errorCode << " (" << __FUNCTION__ << ")");
759 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
762 void ContactSearchEngine::queryAttributeRangeBool(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
763 bool initial_value_is_set, bool initial_value, bool end_value_is_set, bool end_value)
765 const char* view_uri = attributeProperties.viewUri;
766 unsigned int property_contact_id = attributeProperties.propertyContactId;
767 unsigned int property_id = attributeProperties.propertyId;
770 contacts_query_h query = NULL;
771 contacts_filter_h filter = NULL;
772 contacts_list_h list = NULL;
774 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
776 if(initial_value_is_set && end_value_is_set)
778 if(initial_value == end_value)
780 if(initial_value == true)
781 errorCode = contacts_filter_add_bool(filter, property_id, true);
782 else if(end_value == false)
783 errorCode = contacts_filter_add_bool(filter, property_id, false);
786 else if(initial_value_is_set)
788 if(initial_value == true)
789 errorCode = contacts_filter_add_bool(filter, property_id, true);
791 else if(end_value_is_set)
793 if(end_value == false)
794 errorCode = contacts_filter_add_bool(filter, property_id, false);
797 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
800 void ContactSearchEngine::queryAttributeRangeInt(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
801 bool initial_value_is_set, int initial_value, bool end_value_is_set, int end_value)
803 const char* view_uri = attributeProperties.viewUri;
804 unsigned int property_contact_id = attributeProperties.propertyContactId;
805 unsigned int property_id = attributeProperties.propertyId;
808 contacts_query_h query = NULL;
809 contacts_filter_h filter = NULL;
810 contacts_list_h list = NULL;
812 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
814 if(initial_value_is_set && end_value_is_set)
816 contacts_filter_h sub_filter = NULL;
818 errorCode = contacts_filter_create(_contacts_person._uri, &sub_filter);
820 errorCode = contacts_filter_add_int(sub_filter, property_id,
821 CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, initial_value);
823 contacts_filter_add_operator(sub_filter, CONTACTS_FILTER_OPERATOR_AND);
825 errorCode = contacts_filter_add_int(sub_filter, property_id,
826 CONTACTS_MATCH_LESS_THAN_OR_EQUAL, end_value);
828 errorCode = contacts_filter_add_filter(filter, sub_filter);
830 else if(initial_value_is_set)
832 errorCode = contacts_filter_add_int(filter, property_id,
833 CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, initial_value);
835 else if(end_value_is_set)
837 errorCode = contacts_filter_add_int(filter, property_id,
838 CONTACTS_MATCH_LESS_THAN_OR_EQUAL, end_value);
841 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
844 void ContactSearchEngine::queryAttributeRangeString(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
845 const char* initial_value, const char* end_value)
848 const char* view_uri = attributeProperties.viewUri;
849 unsigned int property_contact_id = attributeProperties.propertyContactId;
850 unsigned int property_id = attributeProperties.propertyId;
854 contacts_query_h query = NULL;
855 contacts_filter_h filter = NULL;
856 contacts_list_h list = NULL;
858 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
860 if(initial_value != NULL && end_value != NULL)
862 contacts_filter_h sub_filter = NULL;
864 errorCode = contacts_filter_create(view_uri, &sub_filter);
866 // TODO To be supported start
867 errorCode = contacts_filter_add_str(sub_filter, property_id,
868 CONTACTS_MATCH_STARTSWITH, initial_value);
870 contacts_filter_add_operator(sub_filter, CONTACTS_FILTER_OPERATOR_AND);
872 errorCode = contacts_filter_add_str(sub_filter, property_id,
873 CONTACTS_MATCH_ENDSWITH, end_value);
875 errorCode = contacts_filter_add_filter(filter, sub_filter);
877 else if(initial_value != NULL)
879 errorCode = contacts_filter_add_str(filter, property_id,
880 CONTACTS_MATCH_STARTSWITH, initial_value);
882 else if(end_value != NULL)
884 errorCode = contacts_filter_add_str(filter, property_id,
885 CONTACTS_MATCH_ENDSWITH, end_value);
888 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
892 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
893 bool is_ascending, ContactIdSetPtr& idSet)
895 const char* view_uri = attributeProperties.viewUri;
896 unsigned int property_contact_id = attributeProperties.propertyContactId;
897 unsigned int property_id = attributeProperties.propertyId;
902 contacts_query_h query = NULL;
903 contacts_filter_h filter = NULL;
904 contacts_list_h list = NULL;
906 errorCode = contacts_query_create(view_uri, &query);
907 if(errorCode != CONTACTS_ERROR_NONE)
908 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
910 errorCode = contacts_filter_create(view_uri, &filter);
911 if(errorCode != CONTACTS_ERROR_NONE)
912 ThrowMsg(PlatformException, "contacts_filter_create error : " << errorCode << " (" << __FUNCTION__ << ")");
914 ContactIdSet::iterator iter = idSet->begin();
915 if(iter != idSet->end())
917 errorCode = contacts_filter_add_int(filter, property_contact_id, CONTACTS_MATCH_EQUAL, *iter);
918 for(; iter!=idSet->end(); iter++)
920 errorCode = contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR);
921 if(errorCode != CONTACTS_ERROR_NONE)
922 ThrowMsg(PlatformException, "contacts_filter_add_operator error : " << errorCode << " (" << __FUNCTION__ << ")");
924 errorCode = contacts_filter_add_int(filter, property_contact_id, CONTACTS_MATCH_EQUAL, *iter);
925 if(errorCode != CONTACTS_ERROR_NONE)
926 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
930 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
931 if(errorCode != CONTACTS_ERROR_NONE)
932 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
934 errorCode = contacts_query_set_filter(query, filter);
935 if(errorCode != CONTACTS_ERROR_NONE)
936 ThrowMsg(PlatformException, "contacts_query_set_filter error : " << errorCode << " (" << __FUNCTION__ << ")");
938 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
939 if(errorCode != CONTACTS_ERROR_NONE)
940 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
942 unsigned int record_count = 0;
943 errorCode = contacts_list_get_count(list, &record_count);
944 if(errorCode != CONTACTS_ERROR_NONE)
945 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
947 ContactIdSet overlappingIds;
949 contacts_list_first(list);
950 for(unsigned int i=0; i<record_count; i++)
952 contacts_record_h record;
953 errorCode = contacts_list_get_current_record_p(list, &record);
954 if(errorCode != CONTACTS_ERROR_NONE)
955 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
958 errorCode = contacts_record_get_int(record, property_contact_id, &value);
959 if(errorCode != CONTACTS_ERROR_NONE)
960 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
962 if(overlappingIds.find(value) == overlappingIds.end())
964 result->push_back(value);
965 overlappingIds.insert(value);
968 contacts_list_next(list);
972 contacts_list_destroy(list, true);
975 contacts_filter_destroy(filter);
978 contacts_query_destroy(query);
983 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
986 const char* view_uri = attributeProperties.viewUri;
987 unsigned int property_contact_id = attributeProperties.propertyContactId;
988 unsigned int property_id = attributeProperties.propertyId;
991 contacts_query_h query = NULL;
992 contacts_list_h list = NULL;
994 errorCode = contacts_query_create(view_uri, &query);
995 if(errorCode != CONTACTS_ERROR_NONE)
996 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
998 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
999 if(errorCode != CONTACTS_ERROR_NONE)
1000 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
1002 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
1003 if(errorCode != CONTACTS_ERROR_NONE)
1004 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
1006 unsigned int record_count = 0;
1007 errorCode = contacts_list_get_count(list, &record_count);
1008 if(errorCode != CONTACTS_ERROR_NONE)
1009 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
1011 ContactIdSet overlappingIds;
1013 contacts_list_first(list);
1014 for(unsigned int i=0; i<record_count; i++)
1016 contacts_record_h record;
1017 errorCode = contacts_list_get_current_record_p(list, &record);
1018 if(errorCode != CONTACTS_ERROR_NONE)
1019 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
1022 errorCode = contacts_record_get_int(record, property_contact_id, &value);
1023 if(errorCode != CONTACTS_ERROR_NONE)
1024 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
1026 if(overlappingIds.find(value) == overlappingIds.end())
1028 result->push_back(value);
1029 overlappingIds.insert(value);
1032 contacts_list_next(list);
1036 contacts_list_destroy(list, true);
1039 contacts_query_destroy(query);
1042 void ContactSearchEngine::getIntersection(ContactIdSetArrayPtr& idSets, ContactIdSetPtr& result)
1044 ContactIdSetArray::iterator i;
1046 if(idSets->size() == 0)
1048 result = ContactIdSetPtr(NULL);
1051 else if(idSets->size() == 1)
1053 *result = **idSets->begin();
1057 ContactIdSetArray::iterator minIter;
1058 ContactIdSetArray::size_type minSize =
1059 numeric_limits<ContactIdSetArray::size_type>::max();
1061 for(i=idSets->begin(); i!=idSets->end(); i++)
1063 ContactIdSetPtr idSet = *i;
1064 ContactIdSetArray::size_type size = idSet->size();
1072 ContactIdSetPtr p = *minIter;
1073 ContactIdSetArrayPtr sa = ContactIdSetArrayPtr(new ContactIdSetArray());
1074 for(i=idSets->begin(); i!=idSets->end(); i++)
1082 ContactIdSet::iterator iter;
1083 for(iter=p->begin(); iter!=p->end(); iter++)
1085 bool excluded = false;
1088 for(i=sa->begin(); i!=sa->end(); i++)
1090 ContactIdSetPtr idSet = *i;
1091 if(idSet->find(value) == idSet->end())
1098 if(excluded == false)
1100 result->insert(value);
1105 void ContactSearchEngine::getUnion(ContactIdSetArrayPtr& idSets, ContactIdSetPtr& result)
1107 ContactIdSetArray::iterator i;
1109 if(idSets->size() == 0)
1111 result = ContactIdSetPtr(NULL);
1114 else if(idSets->size() == 1)
1116 *result = **idSets->begin();
1120 for(i=idSets->begin(); i!=idSets->end(); i++)
1122 ContactIdSetPtr ids = *i;
1123 ContactIdSet::iterator j;
1124 for(j=ids->begin(); j!=ids->end(); j++)