execute method
Find More specific query Data with this function
Implementation
Future<List<DataItemRow>> execute(
List<dynamic> selects, {
List<DataFilter>? filters,
List<DataSort>? sorts,
List<dynamic>? groups,
int? limit,
}) async {
if (limit != null) assert(limit > 0, "Limit harus diatas 0");
List<DataItem> items = this;
if (filters != null) items = filterData(filters);
List<DataItemRow> result = await DataCompute().isolate((arguments) async {
await initializeDateFormatting();
List<DataItem> items = arguments[0];
List<dynamic> selects = arguments[1];
// List<DataFilter>? filters = _[2];
// List<DataSort>? sorts = _[3];
List<dynamic>? groups = arguments[4];
List<dynamic> k =
groups?.map((key) {
if (key is String) return DataKey(key);
if (key is DataKey) return key;
if (key is DataSelectDate) return key;
if (key is QueryDistinct) return DataKey(key.key, as: key.as);
throw "Please fill key with String or DataKey value";
}).toList() ??
[];
List<dynamic> groupQueries = [
...selects.whereType<QueryGroup>(),
...(groups ?? []).whereType<String>(),
...(groups ?? []).whereType<DataSelectDate>(),
];
List<dynamic> normQueries = selects
.where(
(value) =>
value is String || value is DataKey || value is DataSelectDate,
)
.map((value) {
if (value is String) {
return DataKey(value);
} else {
return value;
}
})
.toList();
// print("dataGroup.length");
List<List<DataItem>> dataGroup =
(groups ?? []).isEmpty && groupQueries.isNotEmpty
? [items]
: items.groupData(k);
// print(dataGroup.length);
List<DataItemRow> result = [];
for (List<DataItem> dg in dataGroup) {
if (groupQueries.isNotEmpty) {
Map<String, dynamic> temp = {};
for (dynamic gQ in groupQueries) {
for (DataItem item in dg) {
if (gQ is QueryCount) {
try {
temp[gQ.as ?? 'countOf${gQ.key}'] += item.get(gQ.key) != null
? 1
: 0;
} catch (e) {
temp[gQ.as ?? 'countOf${gQ.key}'] = item.get(gQ.key) != null
? 1
: 0;
}
} else if (gQ is QuerySum) {
try {
temp[gQ.as ?? 'sumOf${gQ.key}'] += item.get(gQ.key) ?? 0;
} catch (e) {
temp[gQ.as ?? 'sumOf${gQ.key}'] = item.get(gQ.key) ?? 0;
}
} else if (gQ is QueryAverage) {
try {
temp[gQ.as ?? 'averageOf${gQ.key}'] += item.get(gQ.key) ?? 0;
} catch (e) {
temp[gQ.as ?? 'averageOf${gQ.key}'] = item.get(gQ.key) ?? 0;
}
} else if (gQ is QueryDistinct) {
try {
temp[gQ.as ?? 'distinctOf${gQ.key}'] = item.get(gQ.key);
} catch (e) {
temp[gQ.as ?? 'distinctOf${gQ.key}'] = item.get(gQ.key) ?? 0;
}
} else if (gQ is DataSelectDate) {
temp[gQ.as ?? "dateFormatOf${gQ.key}"] = item.get(gQ);
} else {
temp[gQ] = item.get(gQ);
}
}
if (gQ is QueryAverage) {
if (dg.isEmpty) {
temp[gQ.as ?? 'averageOf${gQ.key}'] = 0;
} else {
temp[gQ.as ?? 'averageOf${gQ.key}'] =
temp[gQ.as ?? 'averageOf${gQ.key}'] / dg.length;
}
}
if (normQueries.isNotEmpty) {
for (DataItem item in dg) {
for (dynamic nm in normQueries) {
temp[nm.key] = item.get(nm);
}
}
}
}
result.add(DataItemRow.fromMap(temp));
if (sorts != null) {
result = result.sortData(sorts);
}
} else {
if (normQueries.isNotEmpty) {
// print(dg.length);
for (DataItem item in dg) {
Map<String, dynamic> temp = {};
for (dynamic nm in normQueries) {
temp[nm.as ?? nm.key] = item.get(nm);
}
result.add(DataItemRow.fromMap(temp));
}
}
}
}
return result;
}, args: [items, selects, filters, sorts, groups]);
if (limit != null && result.length > limit) {
result = result.slices(limit).toList().first;
}
return result;
}