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