keyFieldReferenceToSQL method
Implementation
FutureOr<MapEntry<Type, String>> keyFieldReferenceToSQL(
KeyCondition<dynamic, dynamic> c,
EncodingContext context,
) {
final rootTable = context.tableNameOrEntityName;
final schemeProvider = this.schemeProvider;
if (schemeProvider == null) {
throw ConditionEncodingError(
'No SchemeProvider> tableName: $rootTable > $this',
);
}
final keys = c.keys;
if (keys.isEmpty) {
throw ConditionEncodingError('Empty key path: $c');
}
ConditionKeyField getKey(int index) {
var k = keys[index];
if (k is! ConditionKeyField) {
throw ConditionEncodingError(
"key[$index] is not a `ConditionKeyField`: $k",
);
}
return k;
}
FutureOr<MapEntry<Type, String>> walkKeys({
required int index,
required String sourceTable,
}) {
if (index == keys.length - 1) {
return _resolveFinalField(
schemeProvider: schemeProvider,
context: context,
targetTable: sourceTable,
key: getKey(index),
);
}
return schemeProvider.getTableScheme(sourceTable).resolveMapped((scheme) {
if (scheme == null) {
throw StateError("Can't find `TableScheme` for table: $sourceTable");
}
return _resolveReferenceField(
schemeProvider: schemeProvider,
context: context,
c: c,
sourceScheme: scheme,
sourceTable: sourceTable,
key: getKey(index),
).resolveMapped(
(nextTable) => walkKeys(index: index + 1, sourceTable: nextTable),
);
});
}
return walkKeys(index: 0, sourceTable: rootTable);
}