[Contact] Filter, sort
authorRafal Galka <r.galka@samsung.com>
Mon, 29 Dec 2014 13:39:22 +0000 (14:39 +0100)
committerRafal Galka <r.galka@samsung.com>
Wed, 31 Dec 2014 09:38:47 +0000 (18:38 +0900)
[Verification] Following TCT should pass:
- PersonArraySuccessCallback_onsuccess
- AddressBook_find_errorCallback_invoked
- ContactManager_find_errorCallback_invoked

Change-Id: Ib186d9b1a3219dce6c9991990c05711b75af0bf7

src/contact/js/tizen.contact.AddressBook.js
src/contact/js/tizen.contact.Common.js
src/contact/js/tizen.contact.ContactManager.js

index 038d681..ad898e6 100644 (file)
@@ -431,9 +431,11 @@ AddressBook.prototype.find = function(successCallback, errorCallback, filter, so
     {
       name: 'filter',
       type: AV.Types.PLATFORM_OBJECT,
-      values: [tizen.AttributeFilter,
+      values: [
+        tizen.AttributeFilter,
         tizen.AttributeRangeFilter,
-        tizen.CompositeFilter],
+        tizen.CompositeFilter
+      ],
       optional: true,
       nullable: true
     },
@@ -461,15 +463,15 @@ AddressBook.prototype.find = function(successCallback, errorCallback, filter, so
     });
 
     //TODO: Move filtering to native code
-    //try {
-    //  _contacts = Common.filter(_contacts, args.filter);
-    //} catch (e) {
-    //  native_.callIfPossible(errorCallback, e);
-    //  return;
-    //}
+    try {
+      _contacts = C.filter(_contacts, args.filter);
+    } catch (e) {
+      native_.callIfPossible(errorCallback, e);
+      return;
+    }
 
     //TODO: Move sorting to native code
-    //_contacts = Common.sort(_contacts, args.sortMode);
+    _contacts = C.sort(_contacts, args.sortMode);
 
     native_.callIfPossible(successCallback, _contacts);
   };
index 0600ff8..ce1140d 100644 (file)
@@ -108,3 +108,81 @@ EditGuard.prototype.isEditEnabled = function() {
 };
 
 var _editGuard = new EditGuard();
+
+//TODO: Move sorting and filtering to native code
+var Common = function() {};
+Common.prototype.sort = function(arr, sortMode) {
+  var _getSortProperty = function(obj, props) {
+    for (var i = 0; i < props.length; ++i) {
+      if (!obj.hasOwnProperty(props[i])) {
+        return null;
+      }
+      obj = obj[props[i]];
+    }
+    return obj;
+  };
+
+  if (sortMode instanceof tizen.SortMode) {
+    var props = sortMode.attributeName.split('.');
+    arr.sort(function(a, b) {
+      var aValue = _getSortProperty(a, props);
+      var bValue = _getSortProperty(b, props);
+
+      if (sortMode.order === 'DESC') {
+        return aValue < bValue;
+      }
+      return bValue < aValue;
+    });
+  }
+  return arr;
+};
+
+Common.prototype.filter = function(arr, filter) {
+  if (Type.isNullOrUndefined(arr))
+    return arr;
+  if (filter instanceof tizen.AttributeFilter ||
+      filter instanceof tizen.AttributeRangeFilter ||
+      filter instanceof tizen.CompositeFilter) {
+    arr = arr.filter(function(element) {
+      return filter._filter(element);
+    });
+  }
+  return arr;
+};
+
+Common.prototype.repackFilter = function (filter) {
+  if (filter instanceof tizen.AttributeFilter) {
+    return {
+      filterType: 'AttributeFilter',
+      attributeName: filter.attributeName,
+      matchFlag: filter.matchFlag,
+      matchValue: filter.matchValue
+    };
+  }
+  if (filter instanceof tizen.AttributeRangeFilter) {
+    return {
+      filterType: 'AttributeRangeFilter',
+      attributeName: filter.attributeName,
+      initialValue: Type.isNullOrUndefined(filter.initialValue) ? null : filter.initialValue,
+      endValue: Type.isNullOrUndefined(filter.endValue) ? null : filter.endValue
+    };
+  }
+  if (filter instanceof tizen.CompositeFilter) {
+    var _f = [];
+    var filters = filter.filters;
+
+    for (var i = 0; i < filters.length; ++i) {
+      _f.push(this.repackFilter(filters[i]));
+    }
+
+    return {
+      filterType: 'CompositeFilter',
+      type: filter.type,
+      filters: _f
+    };
+  }
+
+  return null;
+};
+
+var C = new Common();
index f6f756a..57b5df2 100644 (file)
@@ -280,7 +280,7 @@ ContactManager.prototype.find = function() {
 
   // TODO implement contact filtering/sorting.
   var data = {
-    filter: null, //Common.repackFilter(args.filter),
+    filter: C.repackFilter(args.filter),
     sortMode: args.sortMode
   };
 
@@ -294,7 +294,7 @@ ContactManager.prototype.find = function() {
         retval.push(self.get(String(_result[i])));
       }
       //TODO: Move sorting to native code
-      //retval = Common.sort(retval, args.sortMode);
+      retval = C.sort(retval, args.sortMode);
       args.successCallback(retval);
     } else {
       native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));