execute static method

Future<List<JoinedRow>> execute(
  1. Table left,
  2. Table right,
  3. JoinSpec spec
)

Implementation

static Future<List<JoinedRow>> execute(
  Table left,
  Table right,
  JoinSpec spec,
) async {
  final leftRows = await left.scan();
  final rightRows = await right.scan();

  // بناء Hash Table على الجدول الأيمن بالمفتاح rightColumn
  final hash = <dynamic, List<Row>>{};
  for (final r in rightRows) {
    final key = r[spec.rightColumn];
    hash.putIfAbsent(key, () => []).add(r);
  }

  final result = <JoinedRow>[];

  for (final l in leftRows) {
    final key = l[spec.leftColumn];
    final matches = hash[key];

    if (matches == null || matches.isEmpty) {
      // لا يوجد تطابق
      if (spec.type == JoinType.left) {
        // LEFT JOIN: أضف صف اليسار مع null لكل أعمدة اليمين
        final merged = <String, dynamic>{};
        l.values.forEach((k, v) => merged['${spec.leftTable}.$k'] = v);
        for (final col in right.meta.schema.columns) {
          merged['${spec.rightTable}.${col.name}'] = null;
        }
        result.add(JoinedRow(merged));
      }
      // INNER JOIN: تجاهل
    } else {
      for (final r in matches) {
        final merged = <String, dynamic>{};
        l.values.forEach((k, v) => merged['${spec.leftTable}.$k'] = v);
        r.values.forEach((k, v) => merged['${spec.rightTable}.$k'] = v);
        result.add(JoinedRow(merged));
      }
    }
  }

  return result;
}