select method
Implementation
Future<List<MP>> select({
Iterable<String>? fields,
//Map<String, Object?>? subWhere,
MP? where,
int limit = 1200,
Map<String, dynamic> order = const {'created_at': true},
String group = '',
}) {
//parents;
final MP w = {
...?where,
};
final name = this.name;
final q = <String>[
'SELECT ${fields?.join(',') ?? '*'}, fractal.id AS id FROM "$name"',
];
for (final ctrl in [...controllers, Fractal.controller]) {
MP tableWhere = {};
w.removeWhere((key, value) {
if (ctrl.attributes.any((attr) => attr.name == key)) {
tableWhere[key] = value;
return true;
}
return false;
});
String sw = (tableWhere.entries.isNotEmpty)
? makeWhere(
tableWhere,
ctrl,
)
: '';
q.add('''
INNER JOIN "${ctrl.name}" ON
"${ctrl.name}".id = "$name".id
${sw.isNotEmpty ? 'AND $sw' : ''}
''');
}
/*
String fw = '';
if (w.remove('id') case Object idv) {
fw = makeWhere(
{'id': idv},
Fractal.controller,
);
}
if (w.isNotEmpty == true) {
w.removeWhere((key, value) {
q.add('''
INNER JOIN "event" AS "attr_event" ON
"attr_event"."to" = "event"."hash"
INNER JOIN "writer" "attr_writer" ON
"attr_writer".attr = '$key'
INNER JOIN "post" "attr_post" ON
"attr_post"."content" ${switch (value) {
String s => "= '$s'",
false => "= ''",
_ => "!= ''",
}}
''');
return true;
});
}
q.add('''
INNER JOIN fractal ON
"$name".id_fractal = fractal.id
${fw.isNotEmpty ? 'AND $fw' : ''}
${includeSubTypes ? '' : "AND fractal.type = '$name'"}
''');
*/
if (w.entries.isNotEmpty) {
final wH = makeWhere(w, this);
if (wH.isNotEmpty) q.add('WHERE $wH');
}
limit = limit > 0 ? min(limit, maxLimit) : maxLimit;
if (order.isNotEmpty) {
q.add('ORDER BY');
order.forEach((key, v) {
q.add('"$key" ${v ? 'DESC' : 'ASC'}');
});
}
if (group.isNotEmpty) {
q.add('GROUP BY');
order.forEach((key, v) {
q.add('"$group"');
});
}
q.add('''
LIMIT $limit
''');
final query = q.join('\n');
//print(query.replaceAll("\n", " "));
return db.select(
query,
);
}