Skip to content

Commit 41e9ff7

Browse files
committed
Added more working queries, startsWith, greaterThan, lessThan etc
1 parent 9d8c0a5 commit 41e9ff7

File tree

4 files changed

+99
-93
lines changed

4 files changed

+99
-93
lines changed

example/lib/main.dart

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ class _MyAppState extends State<MyApp> {
3535
body: new Center(
3636
child: new Text('Running Parse init'),
3737
),
38-
floatingActionButton: new FloatingActionButton(onPressed: runTestQueries),
38+
floatingActionButton: new FloatingActionButton(
39+
onPressed: runTestQueries),
3940
),
4041
);
4142
}
@@ -51,64 +52,59 @@ class _MyAppState extends State<MyApp> {
5152
);
5253
}
5354

54-
runTestQueries(){
55-
getAllItems();
56-
getAllItemsByName();
57-
getSingleItem();
55+
runTestQueries() {
56+
//getAllItems();
57+
//getAllItemsByName();
58+
//getSingleItem();
5859
query();
59-
initUser();
60+
//initUser();
6061
}
6162

6263
void getAllItemsByName() async {
6364
var apiResponse = await ParseObject('ParseTableName').getAll();
6465

65-
if (apiResponse.success){
66+
if (apiResponse.success) {
6667
for (var testObject in apiResponse.result) {
6768
print(ApplicationConstants.APP_NAME + ": " + testObject.toString());
6869
}
6970
}
7071
}
7172

7273
void getAllItems() async {
73-
var dietPlans = await DietPlan().getAll();
74-
75-
if (dietPlans.success) {
76-
for (var plan in dietPlans.result) {
77-
print(ApplicationConstants.APP_NAME + ": " + (plan as DietPlan).name);
78-
}
79-
} else {
80-
print(ApplicationConstants.APP_NAME + ": " + dietPlans.exception.message);
74+
var response = await DietPlan().getAll();
75+
76+
if (response.success) {
77+
for (var plan in response.result) {
78+
print(ApplicationConstants.APP_NAME + ": " + (plan as DietPlan).name);
8179
}
80+
} else {
81+
print(ApplicationConstants.APP_NAME + ": " + response.exception.message);
82+
}
8283
}
8384

8485
void getSingleItem() async {
85-
var dietPlan = await DietPlan().get('R5EonpUDWy');
86+
var response = await DietPlan().get('R5EonpUDWy');
8687

87-
if (dietPlan.success) {
88-
print(ApplicationConstants.APP_NAME + ": " + (dietPlan.result as DietPlan).toString());
88+
if (response.success) {
89+
print(ApplicationConstants.APP_NAME + ": " + (response.result as DietPlan).toString());
8990
} else {
90-
print(ApplicationConstants.APP_NAME + ": " + dietPlan.exception.message);
91+
print(ApplicationConstants.APP_NAME + ": " + response.exception.message);
9192
}
9293
}
9394

94-
void query() {
95+
void query() async {
9596
// Query for an object by name
96-
QueryBuilder()
97-
..object = DietPlan()
98-
..field = DietPlan.NAME
99-
..equals = ['Paleo']
100-
..query().then((response) {
101-
if (response.success) {
102-
print(ApplicationConstants.APP_NAME +
103-
": " +
104-
((response.result as List<dynamic>).first as DietPlan)
105-
.toString());
106-
} else {
107-
print(ApplicationConstants.APP_NAME +
108-
": " +
109-
response.exception.message);
110-
}
111-
});
97+
var queryBuilder = QueryBuilder<DietPlan>(DietPlan())
98+
..field = DietPlan.FAT
99+
..notEqualTo = [60, 65];
100+
101+
var response = await queryBuilder.query();
102+
103+
if (response.success) {
104+
print(ApplicationConstants.APP_NAME + ": " + ((response.result as List<dynamic>).first as DietPlan).toString());
105+
} else {
106+
print(ApplicationConstants.APP_NAME + ": " + response.exception.message);
107+
}
112108
}
113109

114110
initUser() async {

lib/network/parse_query.dart

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@ import 'package:parse_server_sdk/network/parse_http_client.dart';
55
import 'package:parse_server_sdk/objects/parse_object.dart';
66
import 'package:parse_server_sdk/objects/parse_response.dart';
77

8-
class QueryBuilder {
8+
class QueryBuilder <T extends ParseObject> {
99

10-
ParseObject object;
10+
T object;
1111
final ParseHTTPClient client = ParseHTTPClient();
1212
String path;
1313
String field;
1414
Map results;
1515
Map constraint;
16-
Map<String, Map<String, String>> whereMap =
17-
Map<String, Map<String, String>>();
16+
Map<String, Map<String, String>> whereMap = Map();
1817

1918
// QueryParams
2019
List<dynamic> equals;
@@ -25,7 +24,7 @@ class QueryBuilder {
2524
List<dynamic> notEqualTo;
2625
List<dynamic> contains;
2726
List<dynamic> containedIn;
28-
List<dynamic> notContainerIn;
27+
List<dynamic> notContainedIn;
2928
List<dynamic> exists;
3029
List<dynamic> select;
3130
List<dynamic> dontSelect;
@@ -38,51 +37,69 @@ class QueryBuilder {
3837
String get objectId => null;
3938
Map<String, dynamic> objectData = {};
4039

41-
QueryBuilder() : super();
40+
QueryBuilder(this.object) : super();
4241

4342
void ascending(String attribute) {}
4443

4544
void descending(String attribute) {}
4645

4746
void startsWith(String key, dynamic value) {}
4847

49-
Future<Map> first() {
50-
Map<String, dynamic> t = {};
51-
foo() => t;
52-
return new Future(foo);
53-
}
54-
5548
query() async {
5649
return object.query(_buildQuery());
5750
}
5851

5952
String _buildQuery() {
60-
var existsMap = Map<String, String>();
53+
var existsMap = Map();
54+
55+
// START QUERY
56+
String query = "where=";
6157

58+
// ADD PARAM TO MAP
59+
60+
//Needs fixing
6261
if (equals != null) existsMap = _runThroughQueryParams(equals, field);
63-
if (containedIn != null)
64-
existsMap = _runThroughQueryParamsWithName(containedIn, "in", field);
65-
if (regEx != null)
66-
existsMap = _runThroughQueryParamsWithName(regEx, "regex", field);
67-
if (greaterThan != null)
68-
existsMap = _runThroughQueryParamsWithName(greaterThan, "gt", field);
69-
if (contains != null)
70-
existsMap =
71-
_runThroughQueryParamsWithSearchTerms(contains, "term", field);
72-
73-
//String query = r"""where={"Name":{"$text":{"$search":{"$term":"Diet"}}}}""";
74-
String query = "where=${JsonEncoder().convert(existsMap)}";
62+
if (contains != null) existsMap = _runThroughQueryParamsWithName(contains, "\$term", field);
63+
64+
// Works
65+
if (lessThan != null) existsMap = _runThroughQueryParamsWithName(lessThan, "\$lt", field);
66+
if (lessThanOrEqualTo != null) existsMap = _runThroughQueryParamsWithName(lessThanOrEqualTo, "\$lte", field);
67+
if (greaterThan != null) existsMap = _runThroughQueryParamsWithName(greaterThan, "\$gt", field);
68+
if (greaterThanOrEqualTo != null) existsMap = _runThroughQueryParamsWithName(greaterThanOrEqualTo, "\$gte", field);
69+
if (notEqualTo != null) existsMap = _runThroughQueryParamsWithName(notEqualTo, "\$ne", field);
70+
71+
// Not sure
72+
if (containedIn != null) existsMap = _runThroughQueryParamsWithName(containedIn, "\$in", field);
73+
if (notContainedIn != null) existsMap = _runThroughQueryParamsWithName(notContainedIn, "\$nin", field);
74+
if (exists != null) existsMap = _runThroughQueryParamsWithName(exists, "\$exists", field);
75+
if (select != null) existsMap = _runThroughQueryParamsWithName(select, "\$select", field);
76+
if (dontSelect != null) existsMap = _runThroughQueryParamsWithName(dontSelect, "\$dontSelect", field);
77+
if (all != null) existsMap = _runThroughQueryParamsWithName(all, "\$all", field);
78+
79+
// Works
80+
if (regEx != null) existsMap = _runThroughQueryParamsWithName(regEx, "\$regex", field);
81+
82+
// Doesnt
83+
if (text != null) existsMap = _runThroughQueryParamsWithName(text, "\$text", field);
84+
85+
// -- BUILD QUERY USING MAP
86+
for(var item in existsMap.entries){
87+
query += "{\"${item.key.toString()}\":${item.value}}";
88+
}
7589

90+
// -- ADD LIMITER
7691
if (limit != 0) query += '?limit=$limit';
7792
if (skip != 0) query += '?skip=$skip';
7893

94+
// -- TEST
95+
print("QUERY: $query");
96+
7997
return query;
8098
}
8199

82-
Map<String, String> _runThroughQueryParams(
83-
List<dynamic> list, String queryParam) {
84-
Map<String, String> mapToReturn = Map<String, String>();
85-
var params = "";
100+
Map _runThroughQueryParams(List<dynamic> list, String queryParam) {
101+
Map<String, dynamic> mapToReturn = Map<String, dynamic>();
102+
var params;
86103

87104
if (list.isNotEmpty) {
88105
if (list.length == 1) {
@@ -101,16 +118,15 @@ class QueryBuilder {
101118
return mapToReturn;
102119
}
103120

104-
Map<String, String> _runThroughQueryParamsWithName(
105-
List<dynamic> list, String queryParam, String fieldName) {
121+
Map<String, String> _runThroughQueryParamsWithName(List<dynamic> list, String queryParam, String fieldName) {
106122
Map<String, String> mapToReturn = Map<String, String>();
107123
Map<String, dynamic> mapWithParamData = Map<String, dynamic>();
108124

109125
for (var item in list) {
110-
mapWithParamData["\$$queryParam"] = item;
126+
mapWithParamData.putIfAbsent(queryParam, item);
111127
}
112128

113-
var params = JsonEncoder().convert(mapWithParamData).toString();
129+
var params = JsonEncoder().convert(mapWithParamData);
114130

115131
mapToReturn[fieldName] = params;
116132

lib/objects/parse_object.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ class ParseObject extends ParseBase {
1414
ParseHTTPClient _client;
1515

1616
ParseObject(this.className, {bool debug, ParseHTTPClient client}) {
17+
18+
client == null ? _client = ParseHTTPClient() : _client = client;
19+
1720
if (debug == null) {
18-
_debug = client.data.debug;
21+
_debug = _client.data.debug;
1922
} else {
2023
_debug = debug;
2124
}
2225

2326
_path = "/classes/$className";
2427
setObjectData(Map<String, dynamic>());
25-
client == null ? _client = ParseHTTPClient() : _client = client;
2628
}
2729

2830
get(String objectId) async {
@@ -84,8 +86,8 @@ class ParseObject extends ParseBase {
8486
responseString += "\nStatus Code: ${parseResponse.statusCode}";
8587
responseString += "\nPayload: ${responseData.toString()}";
8688
} else if (!parseResponse.success) {
87-
responseString += "\nStatus Code: ${responseData['code']}";
88-
responseString += "\nException: ${responseData['error']}";
89+
responseString += "\nStatus Code: ${responseData['code'] == null ? parseResponse.statusCode : responseData['code']}";
90+
responseString += "\nException: ${responseData['error'] == null ? responseData.toString() : responseData['error']}";
8991
}
9092

9193
responseString += "\n----\n";

lib/objects/parse_response.dart

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ class ParseResponse {
1111
dynamic result;
1212
ParseException exception;
1313

14-
static ParseResponse _handleSuccess(
15-
ParseResponse response, ParseObject object, String responseBody) {
14+
static ParseResponse _handleSuccess(ParseResponse response, ParseObject object, String responseBody) {
1615
response.success = true;
1716

1817
var map = JsonDecoder().convert(responseBody) as Map;
@@ -23,20 +22,6 @@ class ParseResponse {
2322
response.result = _handleSingleResult(object, map);
2423
}
2524

26-
response = _checkForEmptyResult(response);
27-
28-
return response;
29-
}
30-
31-
static ParseResponse _checkForEmptyResult(ParseResponse response) {
32-
if (response.result == null ||
33-
((response.result == List) &&
34-
(response.result as List<ParseObject>).length == 0)) {
35-
response.exception = ParseException();
36-
response.exception.message = "No result found for query";
37-
response.success = false;
38-
}
39-
4025
return response;
4126
}
4227

@@ -55,13 +40,19 @@ class ParseResponse {
5540
return object.fromJson(map);
5641
}
5742

58-
static ParseResponse _handleError(
59-
ParseResponse response, Response value) {
43+
static ParseResponse _handleError(ParseResponse response, Response value) {
6044
response.exception = ParseException();
6145
response.exception.message = value.reasonPhrase;
6246
return response;
6347
}
6448

49+
static ParseResponse _handleSuccessWithNoResults(ParseResponse response, String value) {
50+
response.statusCode = 200;
51+
response.exception = ParseException();
52+
response.exception.message = value;
53+
return response;
54+
}
55+
6556
static handleResponse(ParseObject object, Response value) {
6657
var response = ParseResponse();
6758

@@ -70,13 +61,14 @@ class ParseResponse {
7061

7162
if (value.statusCode != 200) {
7263
return _handleError(response, value);
64+
} else if (value.body == "{\"results\":[]}"){
65+
return _handleSuccessWithNoResults(response, "Successful request but no results found");
7366
} else {
7467
return _handleSuccess(response, object, value.body);
7568
}
7669
} else {
7770
response.exception = ParseException();
78-
response.exception.message =
79-
"Error reaching server, or server response was null";
71+
response.exception.message = "Error reaching server, or server response was null";
8072
return response;
8173
}
8274
}

0 commit comments

Comments
 (0)