optional and repeat query operators

This commit is contained in:
Simon Leier
2021-03-30 08:35:13 +02:00
parent e5148dfbaf
commit c81af63272
4 changed files with 44 additions and 57 deletions
+16
View File
@@ -175,6 +175,22 @@ extension QueryBuilderInternal<OBJ> on QueryBuilder<OBJ, dynamic> {
);
}
QueryBuilder<OBJ, S> cast<S>() {
return QueryBuilder._(
_collection,
_filterOr,
_filterAnd,
_filterNot,
_whereClauses,
_whereDistinct,
_whereAscending,
_distinctByPropertyIndices,
_sortByProperties,
_offset,
_limit,
);
}
Query<OBJ> buildInternal() {
final builder = andOrInternal(FilterGroupType.Or);
FilterGroup? filter;
@@ -46,6 +46,34 @@ extension QueryLimit<OBJ> on QueryBuilder<OBJ, QLimit> {
}
}
typedef QueryOption<OBJ, T, R> = QueryBuilder<OBJ, R> Function(
QueryBuilder<OBJ, T> q);
extension QueryOptional<OBJ, T> on QueryBuilder<OBJ, T> {
QueryBuilder<OBJ, R> optional<R>(
bool enabled, QueryOption<OBJ, T, R> option) {
if (enabled) {
return option(this);
} else {
return cast();
}
}
}
typedef QueryRepeatModifier<OBJ, T, R, E> = QueryBuilder<OBJ, R> Function(
QueryBuilder<OBJ, T> q, E element);
extension QueryRepeat<OBJ, T, E> on QueryBuilder<OBJ, T> {
QueryBuilder<OBJ, R> repeat<R>(
Iterable<E> items, QueryRepeatModifier<OBJ, T, R, E> modifier) {
QueryBuilder<OBJ, R>? q;
for (var e in items) {
q = modifier((q ?? this).cast(), e);
}
return q ?? cast();
}
}
extension QueryExecute<OBJ> on QueryBuilder<OBJ, QQueryOperations> {
Query<OBJ> build() {
return buildInternal();
@@ -14,7 +14,6 @@ String generateQueryFilter(ObjectInfo oi) {
if (property.isarType == IsarType.String) {
code += generateStringEqualTo(oi, property, i);
code += generateStringIn(oi, property, i);
code += generateStringStartsWith(oi, property, i);
code += generateStringEndsWith(oi, property, i);
code += generateStringContains(oi, property, i);
@@ -24,7 +23,6 @@ String generateQueryFilter(ObjectInfo oi) {
} else {
if (!property.isarType.isFloatDouble) {
code += generateEqualTo(oi, property, i);
code += generateIn(oi, property, i);
}
code += generateGreaterThan(oi, property, i);
code += generateLessThan(oi, property, i);
@@ -50,22 +48,6 @@ String generateEqualTo(ObjectInfo oi, ObjectProperty p, int pIndex) {
}''';
}
String generateIn(ObjectInfo oi, ObjectProperty p, int pIndex) {
return '''
QueryBuilder<${oi.dartName}, QAfterFilterCondition> ${p.dartName.decapitalize()}In(List<${p.dartType}> values) {
return group((q) {
for (var i = 0; i < values.length; i++) {
if (i == values.length - 1) {
return q.${p.dartName.decapitalize()}EqualTo(values[i]);
} else {
q = q.${p.dartName.decapitalize()}EqualTo(values[i]).or();
}
}
throw 'Empty values is unsupported.';
});
}''';
}
String generateGreaterThan(ObjectInfo oi, ObjectProperty p, int pIndex) {
return '''
QueryBuilder<${oi.dartName}, QAfterFilterCondition> ${p.dartName.decapitalize()}GreaterThan(${p.dartType} value, {bool include = false}) {
@@ -134,22 +116,6 @@ String generateStringEqualTo(ObjectInfo oi, ObjectProperty p, int pIndex) {
}''';
}
String generateStringIn(ObjectInfo oi, ObjectProperty p, int pIndex) {
return '''
QueryBuilder<${oi.dartName}, QAfterFilterCondition> ${p.dartName.decapitalize()}In(List<${p.dartType}> values, {bool caseSensitive = true}) {
return group((q) {
for (var i = 0; i < values.length; i++) {
if (i == values.length - 1) {
return q.${p.dartName.decapitalize()}EqualTo(values[i], caseSensitive: caseSensitive);
} else {
q = q.${p.dartName.decapitalize()}EqualTo(values[i], caseSensitive: caseSensitive).or();
}
}
throw 'Empty values is unsupported.';
});
}''';
}
String generateStringStartsWith(ObjectInfo oi, ObjectProperty p, int pIndex) {
var code = '''
QueryBuilder<${oi.dartName}, QAfterFilterCondition> ${p.dartName.decapitalize()}StartsWith(${p.dartType} value, {bool caseSensitive = true}) {
@@ -51,11 +51,6 @@ String generateQueryWhere(ObjectInfo oi) {
code += generateWhereBetween(indexId, oi, property);
}
if (!property.property.isarType.isFloatDouble &&
property.property.isarType != IsarType.Bool) {
code += generateWhereIn(oi, property);
}
if (property.property.isarType == IsarType.Int ||
property.property.isarType == IsarType.Long ||
property.property.isarType.isFloatDouble) {
@@ -272,24 +267,6 @@ String generateWhereIsNotNull(
''';
}
String generateWhereIn(ObjectInfo oi, ObjectIndexProperty indexProperty) {
final p = indexProperty.property;
final name = joinPropertiesToName([indexProperty]);
return '''
QueryBuilder<${oi.dartName}, QAfterWhereClause> ${name}In(List<${p.dartType}> values) {
var q = this;
for (var i = 0; i < values.length; i++) {
if (i == values.length - 1) {
return q.${name}EqualTo(values[i]);
} else {
q = q.${name}EqualTo(values[i]).or();
}
}
throw 'Empty values is unsupported.';
}
''';
}
String generateWhereStartsWith(
int indexId, ObjectInfo oi, ObjectIndexProperty indexProperty) {
final p = indexProperty.property;