Skip to content

Commit

Permalink
feat: add DetaQuery class to create query in search
Browse files Browse the repository at this point in the history
  • Loading branch information
yeikel16 committed Jan 20, 2022
1 parent 934c455 commit 686062b
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 0 deletions.
83 changes: 83 additions & 0 deletions lib/src/deta_query.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
part of 'deta.dart';

/// {@template deta_query}
/// Create a query for search elements in the databese.
/// {@endtemplate}
class DetaQuery {
///{@macro deta_query}
DetaQuery(this.key) : query = <String, dynamic>{};

DetaQuery._withPreviousQuery(this.key, this.query);

/// Key for indicate the search value.
final String key;

/// Query status.
final Map<String, dynamic> query;

/// Join the old query with a new one.
DetaQuery and(String key) {
return DetaQuery._withPreviousQuery(key, query);
}

/// Check the content of [key] is equal to [value].
DetaQuery equalTo(Object value) {
return _createQuery(value, '');
}

/// Check the content of [key] is not equal to [value].
DetaQuery notEqualTo(Object value) {
return _createQuery(value, '?ne');
}

/// Check the content of [key] is less than [value].
DetaQuery lessThan(num value) {
return _createQuery(value, '?lt');
}

/// Check the content of [key] is greater than [value].
DetaQuery greaterThan(num value) {
return _createQuery(value, '?gt');
}

/// Check the content of [key] isgreater than or equal to [value].
DetaQuery greaterThanOrEqualTo(num value) {
return _createQuery(value, '?gte');
}

/// Check the content of [key] is less than or equal to [value].
DetaQuery lessThanOrEqualTo(num value) {
return _createQuery(value, '?lte');
}

/// Check the content of [key] is a prefix equal to [value].
DetaQuery prefix(String value) {
return _createQuery(value, '?pfx');
}

/// Check the content of [key] in the range [start] and [end].
DetaQuery range(num start, num end) {
return _createQuery([start, end], '?r');
}

/// Check the content of [key] constains [value].
///
/// NOTE: Only works for a list of strings, not apply to list
/// of other data types.
DetaQuery contains(String value) {
return _createQuery(value, '?contains');
}

/// Check the content of [key] does not constain [value].
///
/// NOTE: Only works for a list of strings, not apply to list
/// of other data types.
DetaQuery notContains(String value) {
return _createQuery(value, '?not_contains');
}

DetaQuery _createQuery(Object value, String operator) {
query['$key$operator'] = value;
return DetaQuery._withPreviousQuery(key, query);
}
}
92 changes: 92 additions & 0 deletions test/src/deta_query_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import 'package:deta/deta.dart';
import 'package:test/test.dart';

void main() {
late DetaQuery query;
const key = 'name';

setUp(() {
query = DetaQuery(key);
});

group('DetaQuery', () {
test('equalTo', () {
expect(
query.equalTo('Jhon').query,
equals(<String, dynamic>{key: 'Jhon'}),
);
});

test('notEqualTo', () {
expect(
query.notEqualTo('Jhon').query,
equals(<String, dynamic>{'$key?ne': 'Jhon'}),
);
});

test('lessThan', () {
expect(
query.lessThan(16).query,
equals(<String, dynamic>{'$key?lt': 16}),
);
});

test('greaterThan', () {
expect(
query.greaterThan(18).query,
equals(<String, dynamic>{'$key?gt': 18}),
);
});
test('lessThanOrEqualTo', () {
expect(
query.lessThanOrEqualTo(22).query,
equals(<String, dynamic>{'$key?lte': 22}),
);
});
test('greaterThanOrEqualTo', () {
expect(
query.greaterThanOrEqualTo(28).query,
equals(<String, dynamic>{'$key?gte': 28}),
);
});
test('prefix', () {
expect(
query.prefix('coin').query,
equals(<String, dynamic>{'$key?pfx': 'coin'}),
);
});

test('range', () {
expect(
query.range(16, 28).query,
equals(<String, dynamic>{
'$key?r': [16, 28]
}),
);
});
test('contains', () {
expect(
query.contains('@deta.sh').query,
equals(<String, dynamic>{'$key?contains': '@deta.sh'}),
);
});

test('notContains', () {
expect(
query.notContains('@deta.sh').query,
equals(<String, dynamic>{'$key?not_contains': '@deta.sh'}),
);
});

test('and', () {
expect(
DetaQuery('email')
.contains('@deta.sh')
.and('name')
.equalTo('Jhon')
.query,
equals(<String, dynamic>{'email?contains': '@deta.sh', 'name': 'Jhon'}),
);
});
});
}

0 comments on commit 686062b

Please sign in to comment.