generateSelectRelationshipSQL method

FutureOr<SQL> generateSelectRelationshipSQL(
  1. Transaction transaction,
  2. String entityName,
  3. String table,
  4. String field,
  5. dynamic id,
  6. String otherTableName,
)

Implementation

FutureOr<SQL> generateSelectRelationshipSQL(
  Transaction transaction,
  String entityName,
  String table,
  String field,
  dynamic id,
  String otherTableName,
) {
  var retTableScheme = getTableScheme(table);

  return retTableScheme.resolveMapped((tableScheme) {
    if (tableScheme == null) {
      var errorMsg = "Can't find `TableScheme` for table: $table";
      _log.severe(errorMsg);
      throw StateError(errorMsg);
    }

    var relationship = tableScheme.getTableRelationshipReference(
      sourceTable: table,
      sourceField: field,
      targetTable: otherTableName,
    );

    if (relationship == null) {
      throw StateError(
        "Can't find TableRelationshipReference for tables: $table -> $otherTableName",
      );
    }

    var parameters = {'source_id': id};

    var q = dialect.elementQuote;

    var conditionSQL =
        '$q${relationship.sourceRelationshipField}$q = @source_id';

    var sql = StringBuffer();

    sql.write('SELECT $q');
    sql.write(relationship.sourceRelationshipField);
    sql.write('$q as ${q}source_id$q , $q');
    sql.write(relationship.targetRelationshipField);
    sql.write('$q as ${q}target_id$q FROM $q');
    sql.write(relationship.relationshipTable);
    sql.write('$q WHERE ( ');
    sql.write(conditionSQL);
    sql.write(' )');

    var condition = KeyConditionEQ([
      ConditionKeyField(relationship.sourceRelationshipField),
    ], id);

    return SQL(
      sql.toString(),
      null,
      parameters,
      parameters,
      condition: condition,
      sqlCondition: conditionSQL,
      returnColumnsAliases: {
        relationship.sourceRelationshipField: 'source_id',
        relationship.targetRelationshipField: 'target_id',
      },
      mainTable: relationship.relationshipTable,
      relationship: relationship,
    );
  });
}