keyFieldReferenceToSQL method

FutureOr<MapEntry<Type, String>> keyFieldReferenceToSQL(
  1. KeyCondition c,
  2. EncodingContext context
)

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