select method

Future<List<MP>> select({
  1. Iterable<String>? fields,
  2. MP? where,
  3. int limit = 1200,
  4. Map<String, dynamic> order = const {'created_at' : true},
  5. String group = '',
})

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,
  );
}