mirror of
https://github.com/immich-app/isar.git
synced 2026-09-30 13:23:02 +08:00
optional and repeat query operators
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user