execute static method
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;
}