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 if(m_sortOrder == ASCENDING_SORT_ORDER)
195 sortContacts(property, ids, true, m_filteredContactIds);
197 sortContacts(property, ids, false, m_filteredContactIds);
199 result = getContacts(ids);
201 ContactArrayPtr contacts(new ContactArray());
207 length = m_filteredContactIds->size();
208 LogDebug("length : " << length);
211 result = getContacts(m_filteredContactIds);
213 ContactArrayPtr contacts(new ContactArray());
222 AttributePropertiesMap::iterator iter =
223 attributePropertiesMap.find(m_attributeNameForSort);
224 AttributeProperties &property = iter->second;
226 result = getAllContactsSorted(property, m_sortOrder);
230 result = getAllContacts();
238 void ContactSearchEngine::visitPreComposite(FilterType& type, int depth)
240 ContactIdSetArrayPtr idSets = ContactIdSetArrayPtr(new ContactIdSetArray());
242 m_contactIdSetArrayStack.push(idSets);
245 void ContactSearchEngine::visitInComposite(FilterType& type, int depth)
250 void ContactSearchEngine::visitPostComposite(FilterType& type, int depth)
252 ContactIdSetArrayPtr idSets = m_contactIdSetArrayStack.top();
253 m_contactIdSetArrayStack.pop();
255 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
257 if(type == UNION_FILTER)
258 getUnion(idSets, idSet);
259 else if(type == INTERSECTION_FILTER)
260 getIntersection(idSets, idSet);
264 m_filteredContactIds = idSet;
270 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
271 parentIdSets->push_back(idSet);
276 void ContactSearchEngine::visitAttribute(string& attrName, MatchFlag& matchFlag, AnyPtr& matchValue, int depth)
278 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
282 string value = matchValue->getString();
283 idSet->insert(ContactUtility::strToInt(value));
286 m_filteredContactIds = idSet;
289 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
290 parentIdSets->push_back(idSet);
295 else if(attrName == "addresses.types" ||
296 attrName == "emails.types" ||
297 attrName == "phoneNumbers.types" ||
298 attrName == "urls.type")
301 m_filteredContactIds = ContactIdSetPtr(NULL);
306 AttributePropertiesMap::iterator iter =
307 attributePropertiesMap.find(attrName);
308 if(iter == attributePropertiesMap.end())
309 ThrowMsg(NotFoundException, "There is no attribute name for filter : " << attrName);
310 AttributeProperties &properties = iter->second;
312 if(properties.type == ContactSvcPrimitiveType_Boolean)
314 bool value = matchValue->getBool();
316 queryAttributeBool(properties, idSet, value);
318 else if(properties.type == ContactSvcPrimitiveType_String)
320 string value = matchValue->getString();
321 contacts_match_str_flag_e flag = CONTACTS_MATCH_EXISTS;
323 if(matchFlag == MATCH_EXACTLY)
324 flag = CONTACTS_MATCH_EXACTLY;
325 else if(matchFlag == MATCH_FULLSTRING)
326 flag = CONTACTS_MATCH_FULLSTRING;
327 else if(matchFlag == MATCH_CONTAINS)
328 flag = CONTACTS_MATCH_CONTAINS;
329 else if(matchFlag == MATCH_STARTSWITH)
330 flag = CONTACTS_MATCH_STARTSWITH;
331 else if(matchFlag == MATCH_ENDSWITH)
332 flag = CONTACTS_MATCH_ENDSWITH;
333 else if(matchFlag == MATCH_EXISTS)
334 flag = CONTACTS_MATCH_EXISTS;
336 queryAttributeString(properties, idSet, flag, value.c_str());
338 else if(properties.type == ContactSvcPrimitiveType_Int)
343 value = ContactUtility::strToInt(matchValue->getString());
345 value = matchValue->getInt();
347 contacts_match_int_flag_e flag;
348 if(matchFlag == MATCH_EXISTS)
350 flag = CONTACTS_MATCH_GREATER_THAN_OR_EQUAL;
353 flag = CONTACTS_MATCH_EQUAL;
356 queryAttributeInt(properties, idSet, flag, value);
361 m_filteredContactIds = idSet;
367 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
368 parentIdSets->push_back(idSet);
373 void ContactSearchEngine::visitAttributeRange(string& attrName, AnyPtr& initialValue, AnyPtr& endValue, int depth)
375 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
377 bool initialValueIsSet = false;
378 bool endValueIsSet = false;
380 if(initialValue != NULL || initialValue->isNullOrUndefined())
381 initialValueIsSet = false;
383 if(endValue != NULL || endValue->isNullOrUndefined())
384 endValueIsSet = false;
386 if(!initialValueIsSet && !endValueIsSet)
389 m_filteredContactIds = ContactIdSetPtr(NULL);
397 m_filteredContactIds = idSet;
400 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
401 parentIdSets->push_back(idSet);
406 else if(attrName == "addresses.types" ||
407 attrName == "emails.types" ||
408 attrName == "phoneNumbers.types" ||
409 attrName == "urls.type")
412 m_filteredContactIds = ContactIdSetPtr(NULL);
417 AttributePropertiesMap::iterator iter =
418 attributePropertiesMap.find(attrName);
419 if(iter == attributePropertiesMap.end())
420 ThrowMsg(NotFoundException, "There is no attribute name for filter : " << attrName);
421 AttributeProperties &properties = iter->second;
423 if(properties.type == ContactSvcPrimitiveType_Boolean)
425 bool initialValueBool = false;
426 bool endValueBool = false;
428 if(initialValueIsSet)
429 initialValueBool = initialValue->getBool();
431 endValueBool = endValue->getBool();
433 queryAttributeRangeBool(properties, idSet, initialValueIsSet, initialValueBool, endValueIsSet, endValueBool);
435 else if(properties.type == ContactSvcPrimitiveType_String)
437 const char *initialValueCStr = NULL;
438 const char *endValueCStr = NULL;
440 string initialValueStr;
443 if(initialValueIsSet)
445 initialValueStr = initialValue->getString();
446 initialValueCStr = initialValueStr.c_str();
450 endValueStr = endValue->getString();
451 endValueCStr = endValueStr.c_str();
454 queryAttributeRangeString(properties, idSet, initialValueCStr, endValueCStr);
456 else if(properties.type == ContactSvcPrimitiveType_Int)
458 int initialValueInt = 0;
463 if(initialValueIsSet)
464 initialValueInt = ContactUtility::strToInt(initialValue->getString());
466 endValueInt = ContactUtility::strToInt(endValue->getString());
470 if(initialValueIsSet)
471 initialValueInt = initialValue->getInt();
473 endValueInt = endValue->getInt();
476 queryAttributeRangeInt(properties, idSet, initialValueIsSet, initialValueInt, endValueIsSet, endValueInt);
481 m_filteredContactIds = idSet;
485 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
486 parentIdSets->push_back(idSet);
490 ContactArrayPtr ContactSearchEngine::getAllContactsSorted(AttributeProperties& attributeProperties, bool is_ascending)
492 ContactArrayPtr contacts = ContactArrayPtr(new ContactArray());
494 ContactArrayPtr allContacts = getAllContacts();
495 ContactIdArrayPtr sortedIds = ContactIdArrayPtr(new ContactIdArray());
497 sortContacts(attributeProperties, sortedIds, is_ascending);
499 map<int,ContactPtr> contactMap;
501 ContactArray::iterator citer;
502 for(citer=allContacts->begin(); citer!=allContacts->end(); citer++)
504 ContactPtr contact = *citer;
505 int id = ContactUtility::strToInt(contact->getId());
506 contactMap.insert(pair<int,ContactPtr>(id, contact));
509 ContactIdArray::iterator iter;
510 for(iter=sortedIds->begin(); iter!=sortedIds->end(); iter++)
514 map<int,ContactPtr>::iterator idPair = contactMap.find(id);
515 if(idPair == contactMap.end())
517 LogWarning("no contact id : " << id);
520 contacts->push_back(idPair->second);
526 ContactArrayPtr ContactSearchEngine::getAllContacts()
530 ContactArrayPtr contacts(new ContactArray());
531 contacts_list_h list = NULL;
533 LogDebug("start : " << m_isAddressBookIdSet);
535 if(!m_isAddressBookIdSet)
537 errorCode = contacts_db_get_all_records(_contacts_contact._uri, 0, 0, &list);
538 if(errorCode != CONTACTS_ERROR_NONE)
539 ThrowMsg(PlatformException, "contacts_db_get_all_records error : " << errorCode << " (" << __FUNCTION__ << ")");
543 contacts_query_h query = NULL;
544 contacts_filter_h filter = NULL;
546 errorCode = contacts_query_create(_contacts_contact._uri, &query);
547 if(errorCode != CONTACTS_ERROR_NONE)
548 ThrowMsg(PlatformException, "Fail to get contacts_query_create (ret:" << errorCode << ")");
550 errorCode = contacts_filter_create(_contacts_contact._uri, &filter);
551 if(errorCode != CONTACTS_ERROR_NONE)
552 ThrowMsg(PlatformException, "Fail to get contacts_filter_create (ret:" << errorCode << ")");
554 errorCode = contacts_filter_add_int(filter, _contacts_contact.address_book_id, CONTACTS_MATCH_EQUAL, m_addressBookId);
555 if(errorCode != CONTACTS_ERROR_NONE)
556 ThrowMsg(PlatformException, "Fail to get contacts_filter_add_int (ret:" << errorCode << ")");
558 errorCode = contacts_query_set_filter(query, filter);
559 if(errorCode != CONTACTS_ERROR_NONE)
560 ThrowMsg(PlatformException, "Fail to get contacts_query_set_filter (ret:" << errorCode << ")");
562 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
563 if(errorCode != CONTACTS_ERROR_NONE)
564 ThrowMsg(PlatformException, "Fail to get contacts_db_get_records_with_query (ret:" << errorCode << ")");
566 errorCode = contacts_filter_destroy(filter);
567 if(errorCode != CONTACTS_ERROR_NONE)
568 ThrowMsg(PlatformException, "Fail to get contacts_filter_destroy (ret:" << errorCode << ")");
570 errorCode = contacts_query_destroy(query);
571 if(errorCode != CONTACTS_ERROR_NONE)
572 ThrowMsg(PlatformException, "Fail to get contacts_query_destroy (ret:" << errorCode << ")");
575 unsigned int record_count = 0;
576 errorCode = contacts_list_get_count(list, &record_count);
577 if(errorCode != CONTACTS_ERROR_NONE)
578 ThrowMsg(PlatformException, "Fail to get contacts_list_get_count : " << errorCode << " (" << __FUNCTION__ << ")");
580 contacts_list_first(list);
581 for(unsigned int i=0; i<record_count; i++)
583 contacts_record_h record;
584 errorCode = contacts_list_get_current_record_p(list, &record);
585 if(errorCode != CONTACTS_ERROR_NONE || record == NULL)
587 LogWarning("contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
591 ContactPtr contact(NULL);
594 ContactObjectP2AConverterPtr contactObjConverter(
595 new ContactObjectP2AConverter(record, false));
597 contact = contactObjConverter->getAbstractContact();
601 LogWarning("fail to convert contact");
605 contacts->push_back(contact);
607 contacts_list_next(list);
611 contacts_list_destroy(list, true);
618 ContactArrayPtr ContactSearchEngine::getContacts(ContactIdArrayPtr& ids)
620 ContactArrayPtr contacts(new ContactArray());
622 ContactIdArray::iterator iter;
623 for(iter=ids->begin(); iter!=ids->end(); iter++)
627 ContactPtr contact = getContact(*iter);
629 contacts->push_back(contact);
633 LogWarning(_rethrown_exception.GetMessage());
641 ContactArrayPtr ContactSearchEngine::getContacts(ContactIdSetPtr& ids)
643 ContactArrayPtr contacts(new ContactArray());
645 ContactIdSet::iterator iter;
646 for(iter=ids->begin(); iter!=ids->end(); iter++)
650 ContactPtr contact = getContact(*iter);
652 contacts->push_back(contact);
656 LogWarning(_rethrown_exception.GetMessage());
663 ContactPtr ContactSearchEngine::getContact(int id)
666 contacts_record_h record = NULL;
668 errorCode = contacts_db_get_record(_contacts_contact._uri, id, &record);
669 if(errorCode != CONTACTS_ERROR_NONE)
671 LogError("No contact (id:" << id << ") : " << errorCode << " (" << __FUNCTION__ << ")");
672 return ContactPtr(NULL);
675 if(m_isAddressBookIdSet)
677 int addressBookId = 0;
679 errorCode = contacts_record_get_int(record, _contacts_contact.address_book_id, &addressBookId);
680 if(errorCode != CONTACTS_ERROR_NONE)
682 LogError("No contact (id:" << id << ") 2 : " << errorCode << " (" << __FUNCTION__ << ")");
683 return ContactPtr(NULL);
686 if(addressBookId != m_addressBookId)
687 return ContactPtr(NULL);
690 ContactObjectP2AConverterPtr contactObjConverter(
691 new ContactObjectP2AConverter(record, false));
692 ContactPtr contact = contactObjConverter->getAbstractContact();
697 void ContactSearchEngine::queryAttributeBool(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
700 const char* view_uri = attributeProperties.viewUri;
701 unsigned int property_contact_id = attributeProperties.propertyContactId;
702 unsigned int property_id = attributeProperties.propertyId;
705 contacts_query_h query = NULL;
706 contacts_filter_h filter = NULL;
707 contacts_list_h list = NULL;
709 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
711 errorCode = contacts_filter_add_bool(filter, property_id, match_value);
712 if(errorCode != CONTACTS_ERROR_NONE)
714 ThrowMsg(PlatformException, "contacts_filter_add_bool error : " << errorCode << " (" << __FUNCTION__ << ")");
717 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
720 void ContactSearchEngine::queryAttributeInt(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
721 contacts_match_int_flag_e match, int match_value)
723 const char* view_uri = attributeProperties.viewUri;
724 unsigned int property_contact_id = attributeProperties.propertyContactId;
725 unsigned int property_id = attributeProperties.propertyId;
728 contacts_query_h query = NULL;
729 contacts_filter_h filter = NULL;
730 contacts_list_h list = NULL;
732 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
734 errorCode = contacts_filter_add_int(filter, property_id, match, match_value);
735 if(errorCode != CONTACTS_ERROR_NONE)
737 ThrowMsg(PlatformException, "contacts_filter_add_int error : " << errorCode << " (" << __FUNCTION__ << ")");
740 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
743 void ContactSearchEngine::queryAttributeString(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
744 contacts_match_str_flag_e match, const char* match_value)
746 const char* view_uri = attributeProperties.viewUri;
747 unsigned int property_contact_id = attributeProperties.propertyContactId;
748 unsigned int property_id = attributeProperties.propertyId;
751 contacts_query_h query = NULL;
752 contacts_filter_h filter = NULL;
753 contacts_list_h list = NULL;
755 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
757 errorCode = contacts_filter_add_str(filter, property_id, match, match_value);
758 if(errorCode != CONTACTS_ERROR_NONE)
760 ThrowMsg(PlatformException, "contacts_filter_add_int error : " << errorCode << " (" << __FUNCTION__ << ")");
763 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
766 void ContactSearchEngine::queryAttributeRangeBool(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
767 bool initial_value_is_set, bool initial_value, bool end_value_is_set, bool end_value)
769 const char* view_uri = attributeProperties.viewUri;
770 unsigned int property_contact_id = attributeProperties.propertyContactId;
771 unsigned int property_id = attributeProperties.propertyId;
774 contacts_query_h query = NULL;
775 contacts_filter_h filter = NULL;
776 contacts_list_h list = NULL;
778 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
780 if(initial_value_is_set && end_value_is_set)
782 if(initial_value == end_value)
784 if(initial_value == true)
785 errorCode = contacts_filter_add_bool(filter, property_id, true);
786 else if(end_value == false)
787 errorCode = contacts_filter_add_bool(filter, property_id, false);
790 else if(initial_value_is_set)
792 if(initial_value == true)
793 errorCode = contacts_filter_add_bool(filter, property_id, true);
795 else if(end_value_is_set)
797 if(end_value == false)
798 errorCode = contacts_filter_add_bool(filter, property_id, false);
801 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
804 void ContactSearchEngine::queryAttributeRangeInt(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
805 bool initial_value_is_set, int initial_value, bool end_value_is_set, int end_value)
807 const char* view_uri = attributeProperties.viewUri;
808 unsigned int property_contact_id = attributeProperties.propertyContactId;
809 unsigned int property_id = attributeProperties.propertyId;
812 contacts_query_h query = NULL;
813 contacts_filter_h filter = NULL;
814 contacts_list_h list = NULL;
816 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
818 if(initial_value_is_set && end_value_is_set)
820 contacts_filter_h sub_filter = NULL;
822 errorCode = contacts_filter_create(_contacts_person._uri, &sub_filter);
824 errorCode = contacts_filter_add_int(sub_filter, property_id,
825 CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, initial_value);
827 contacts_filter_add_operator(sub_filter, CONTACTS_FILTER_OPERATOR_AND);
829 errorCode = contacts_filter_add_int(sub_filter, property_id,
830 CONTACTS_MATCH_LESS_THAN_OR_EQUAL, end_value);
832 errorCode = contacts_filter_add_filter(filter, sub_filter);
834 else if(initial_value_is_set)
836 errorCode = contacts_filter_add_int(filter, property_id,
837 CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, initial_value);
839 else if(end_value_is_set)
841 errorCode = contacts_filter_add_int(filter, property_id,
842 CONTACTS_MATCH_LESS_THAN_OR_EQUAL, end_value);
845 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
848 void ContactSearchEngine::queryAttributeRangeString(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
849 const char* initial_value, const char* end_value)
852 const char* view_uri = attributeProperties.viewUri;
853 unsigned int property_contact_id = attributeProperties.propertyContactId;
854 unsigned int property_id = attributeProperties.propertyId;
858 contacts_query_h query = NULL;
859 contacts_filter_h filter = NULL;
860 contacts_list_h list = NULL;
862 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
864 if(initial_value != NULL && end_value != NULL)
866 contacts_filter_h sub_filter = NULL;
868 errorCode = contacts_filter_create(view_uri, &sub_filter);
870 // TODO To be supported start
871 errorCode = contacts_filter_add_str(sub_filter, property_id,
872 CONTACTS_MATCH_STARTSWITH, initial_value);
874 contacts_filter_add_operator(sub_filter, CONTACTS_FILTER_OPERATOR_AND);
876 errorCode = contacts_filter_add_str(sub_filter, property_id,
877 CONTACTS_MATCH_ENDSWITH, end_value);
879 errorCode = contacts_filter_add_filter(filter, sub_filter);
881 else if(initial_value != NULL)
883 errorCode = contacts_filter_add_str(filter, property_id,
884 CONTACTS_MATCH_STARTSWITH, initial_value);
886 else if(end_value != NULL)
888 errorCode = contacts_filter_add_str(filter, property_id,
889 CONTACTS_MATCH_ENDSWITH, end_value);
892 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
896 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
897 bool is_ascending, ContactIdSetPtr& idSet)
899 const char* view_uri = attributeProperties.viewUri;
900 unsigned int property_contact_id = attributeProperties.propertyContactId;
901 unsigned int property_id = attributeProperties.propertyId;
906 contacts_query_h query = NULL;
907 contacts_filter_h filter = NULL;
908 contacts_list_h list = NULL;
910 errorCode = contacts_query_create(view_uri, &query);
911 if(errorCode != CONTACTS_ERROR_NONE)
912 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
914 errorCode = contacts_filter_create(view_uri, &filter);
915 if(errorCode != CONTACTS_ERROR_NONE)
916 ThrowMsg(PlatformException, "contacts_filter_create error : " << errorCode << " (" << __FUNCTION__ << ")");
918 ContactIdSet::iterator iter = idSet->begin();
919 if(iter != idSet->end())
921 errorCode = contacts_filter_add_int(filter, property_contact_id, CONTACTS_MATCH_EQUAL, *iter);
922 for(; iter!=idSet->end(); iter++)
924 errorCode = contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR);
925 if(errorCode != CONTACTS_ERROR_NONE)
926 ThrowMsg(PlatformException, "contacts_filter_add_operator error : " << errorCode << " (" << __FUNCTION__ << ")");
928 errorCode = contacts_filter_add_int(filter, property_contact_id, CONTACTS_MATCH_EQUAL, *iter);
929 if(errorCode != CONTACTS_ERROR_NONE)
930 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
934 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
935 if(errorCode != CONTACTS_ERROR_NONE)
936 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
938 errorCode = contacts_query_set_filter(query, filter);
939 if(errorCode != CONTACTS_ERROR_NONE)
940 ThrowMsg(PlatformException, "contacts_query_set_filter error : " << errorCode << " (" << __FUNCTION__ << ")");
942 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
943 if(errorCode != CONTACTS_ERROR_NONE)
944 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
946 unsigned int record_count = 0;
947 errorCode = contacts_list_get_count(list, &record_count);
948 if(errorCode != CONTACTS_ERROR_NONE)
949 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
951 ContactIdSet overlappingIds;
953 contacts_list_first(list);
954 for(unsigned int i=0; i<record_count; i++)
956 contacts_record_h record;
957 errorCode = contacts_list_get_current_record_p(list, &record);
958 if(errorCode != CONTACTS_ERROR_NONE)
959 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
962 errorCode = contacts_record_get_int(record, property_contact_id, &value);
963 if(errorCode != CONTACTS_ERROR_NONE)
964 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
966 if(overlappingIds.find(value) == overlappingIds.end())
968 result->push_back(value);
969 overlappingIds.insert(value);
972 contacts_list_next(list);
976 contacts_list_destroy(list, true);
979 contacts_filter_destroy(filter);
982 contacts_query_destroy(query);
987 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
990 const char* view_uri = attributeProperties.viewUri;
991 unsigned int property_contact_id = attributeProperties.propertyContactId;
992 unsigned int property_id = attributeProperties.propertyId;
995 contacts_query_h query = NULL;
996 contacts_list_h list = NULL;
998 errorCode = contacts_query_create(view_uri, &query);
999 if(errorCode != CONTACTS_ERROR_NONE)
1000 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
1002 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
1003 if(errorCode != CONTACTS_ERROR_NONE)
1004 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
1006 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
1007 if(errorCode != CONTACTS_ERROR_NONE)
1008 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
1010 unsigned int record_count = 0;
1011 errorCode = contacts_list_get_count(list, &record_count);
1012 if(errorCode != CONTACTS_ERROR_NONE)
1013 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
1015 ContactIdSet overlappingIds;
1017 contacts_list_first(list);
1018 for(unsigned int i=0; i<record_count; i++)
1020 contacts_record_h record;
1021 errorCode = contacts_list_get_current_record_p(list, &record);
1022 if(errorCode != CONTACTS_ERROR_NONE)
1023 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
1026 errorCode = contacts_record_get_int(record, property_contact_id, &value);
1027 if(errorCode != CONTACTS_ERROR_NONE)
1028 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
1030 if(overlappingIds.find(value) == overlappingIds.end())
1032 result->push_back(value);
1033 overlappingIds.insert(value);
1036 contacts_list_next(list);
1040 contacts_list_destroy(list, true);
1043 contacts_query_destroy(query);
1046 void ContactSearchEngine::getIntersection(ContactIdSetArrayPtr& idSets, ContactIdSetPtr& result)
1048 ContactIdSetArray::iterator i;
1050 if(idSets->size() == 0)
1052 result = ContactIdSetPtr(NULL);
1055 else if(idSets->size() == 1)
1057 *result = **idSets->begin();
1061 ContactIdSetArray::iterator minIter;
1062 ContactIdSetArray::size_type minSize =
1063 numeric_limits<ContactIdSetArray::size_type>::max();
1065 for(i=idSets->begin(); i!=idSets->end(); i++)
1067 ContactIdSetPtr idSet = *i;
1068 ContactIdSetArray::size_type size = idSet->size();
1076 ContactIdSetPtr p = *minIter;
1077 ContactIdSetArrayPtr sa = ContactIdSetArrayPtr(new ContactIdSetArray());
1078 for(i=idSets->begin(); i!=idSets->end(); i++)
1086 ContactIdSet::iterator iter;
1087 for(iter=p->begin(); iter!=p->end(); iter++)
1089 bool excluded = false;
1092 for(i=sa->begin(); i!=sa->end(); i++)
1094 ContactIdSetPtr idSet = *i;
1095 if(idSet->find(value) == idSet->end())
1102 if(excluded == false)
1104 result->insert(value);
1109 void ContactSearchEngine::getUnion(ContactIdSetArrayPtr& idSets, ContactIdSetPtr& result)
1111 ContactIdSetArray::iterator i;
1113 if(idSets->size() == 0)
1115 result = ContactIdSetPtr(NULL);
1118 else if(idSets->size() == 1)
1120 *result = **idSets->begin();
1124 for(i=idSets->begin(); i!=idSets->end(); i++)
1126 ContactIdSetPtr ids = *i;
1127 ContactIdSet::iterator j;
1128 for(j=ids->begin(); j!=ids->end(); j++)