renderCreateTable method

  1. @override
List<String> renderCreateTable(
  1. TableBlueprint blueprint, {
  2. bool ifNotExists = false,
})
override

Implementation

@override
List<String> renderCreateTable(
  TableBlueprint blueprint, {
  bool ifNotExists = false,
}) {
  final statements = <String>[];

  final required = <String>[];
  final properties = <String, dynamic>{};

  for (final col in blueprint.columns) {
    properties[col.name] = _mongoBsonSchema(col);
    if (!col.nullable) required.add(col.name);
  }

  final validator = <String, dynamic>{
    '\$jsonSchema': {
      'bsonType': 'object',
      if (required.isNotEmpty) 'required': required,
      'properties': properties,
    },
  };

  statements.add(
    jsonEncode({
      '_vania_migration': 'createCollection',
      'name': blueprint.tableName,
      'options': {'validator': validator},
    }),
  );

  for (final idx in blueprint.indexes) {
    statements.add(
      jsonEncode({
        '_vania_migration': 'createIndex',
        'collection': blueprint.tableName,
        'keys': {for (final c in idx.columns) c: 1},
        'options': {
          'name': idx.name,
          if (idx.type == ColumnIndex.unique) 'unique': true,
        },
      }),
    );
  }

  for (final uc in blueprint.uniqueConstraints) {
    statements.add(
      jsonEncode({
        '_vania_migration': 'createIndex',
        'collection': blueprint.tableName,
        'keys': {for (final c in uc.columns) c: 1},
        'options': {'name': uc.name, 'unique': true},
      }),
    );
  }

  for (final fk in blueprint.foreignKeys) {
    statements.add(
      jsonEncode({
        '_vania_migration': 'createIndex',
        'collection': blueprint.tableName,
        'keys': {fk.columnName: 1},
        'options': {'name': 'idx_fk_${fk.columnName}'},
      }),
    );
  }

  return statements;
}