diff --git a/.gitignore b/.gitignore index c4f26e041..5cb586d1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .DS_Store .dart_tool/ - +.history .packages .pub/ pubspec.lock diff --git a/lib/src/base/parse_constants.dart b/lib/src/base/parse_constants.dart index 2f61a8c05..50256ab1d 100644 --- a/lib/src/base/parse_constants.dart +++ b/lib/src/base/parse_constants.dart @@ -15,6 +15,7 @@ const String keyEndPointVerificationEmail = '/verificationEmailRequest'; const String keyEndPointRequestPasswordReset = '/requestPasswordReset'; const String keyEndPointClasses = '/classes/'; const String keyEndPointHealth = '/health'; +const String keyEndPointAggregate = '/aggregate/'; // ParseObject variables const String keyVarClassName = 'className'; diff --git a/lib/src/network/parse_query.dart b/lib/src/network/parse_query.dart index 797fc4182..4c8b06266 100644 --- a/lib/src/network/parse_query.dart +++ b/lib/src/network/parse_query.dart @@ -246,7 +246,8 @@ class QueryBuilder { // Add a constraint to the query that requires a particular key's value match another QueryBuilder // ignore: always_specify_types void whereMatchesQuery(String column, QueryBuilder query) { - final String inQuery = query._buildQueryRelational(query.object.parseClassName); + final String inQuery = + query._buildQueryRelational(query.object.parseClassName); queries.add(MapEntry( _SINGLE_QUERY, '\"$column\":{\"\$inQuery\":$inQuery}')); @@ -255,7 +256,8 @@ class QueryBuilder { //Add a constraint to the query that requires a particular key's value does not match another QueryBuilder // ignore: always_specify_types void whereDoesNotMatchQuery(String column, QueryBuilder query) { - final String inQuery = query._buildQueryRelational(query.object.parseClassName); + final String inQuery = + query._buildQueryRelational(query.object.parseClassName); queries.add(MapEntry( _SINGLE_QUERY, '\"$column\":{\"\$notInQuery\":$inQuery}')); @@ -268,6 +270,11 @@ class QueryBuilder { return object.query(_buildQuery()); } + Future distinct(String className) async { + String queryString = "distinct=$className"; + return object.distinct(queryString); + } + ///Counts the number of objects that match this query Future count() async { return object.query(_buildQueryCount()); diff --git a/lib/src/objects/parse_object.dart b/lib/src/objects/parse_object.dart index 2c790c2c8..249bdb890 100644 --- a/lib/src/objects/parse_object.dart +++ b/lib/src/objects/parse_object.dart @@ -12,6 +12,7 @@ class ParseObject extends ParseBase implements ParseCloneable { : super() { parseClassName = className; _path = '$keyEndPointClasses$className'; + _aggregatepath = '$keyEndPointAggregate$className'; _debug = isDebugEnabled(objectLevelDebug: debug); _client = client ?? @@ -28,6 +29,7 @@ class ParseObject extends ParseBase implements ParseCloneable { ParseObject.clone(parseClassName)..fromJson(map); String _path; + String _aggregatepath; bool _debug; ParseHTTPClient _client; @@ -104,8 +106,7 @@ class ParseObject extends ParseBase implements ParseCloneable { if (response != null) { if (response.success) { _savingChanges.clear(); - } - else { + } else { _revertSavingChanges(); } return response; @@ -175,8 +176,7 @@ class ParseObject extends ParseBase implements ParseCloneable { if (response.results[i] is ParseError) { // Batch request succeed, but part of batch failed. chunk[i]._revertSavingChanges(); - } - else { + } else { chunk[i]._savingChanges.clear(); } } @@ -483,6 +483,17 @@ class ParseObject extends ParseBase implements ParseCloneable { } } + Future distinct(String query) async { + try { + final Uri url = getSanitisedUri(_client, '$_aggregatepath', query: query); + final Response result = await _client.get(url); + return handleResponse( + this, result, ParseApiRQ.query, _debug, parseClassName); + } on Exception catch (e) { + return handleException(e, ParseApiRQ.query, _debug, parseClassName); + } + } + /// Deletes the current object locally and online Future delete({String id, String path}) async { try { diff --git a/lib/src/objects/response/parse_response_builder.dart b/lib/src/objects/response/parse_response_builder.dart index 782de2673..893010503 100644 --- a/lib/src/objects/response/parse_response_builder.dart +++ b/lib/src/objects/response/parse_response_builder.dart @@ -91,10 +91,16 @@ class _ParseResponseBuilder { response.result = map; } else if (map != null && map.length == 1 && map.containsKey('results')) { final List results = map['results']; - final List items = _handleMultipleResults(object, results); - response.results = items; - response.result = items; - response.count = items.length; + if (results[0] is String) { + response.results = results; + response.result = results; + response.count = results.length; + } else { + final List items = _handleMultipleResults(object, results); + response.results = items; + response.result = items; + response.count = items.length; + } } else if (map != null && map.length == 2 && map.containsKey('count')) { final List results = [map['count']]; response.results = results;