mirror of https://github.com/AMT-Cheif/drift.git
Extract columns override into shared method
This commit is contained in:
parent
91495e6f8d
commit
31e1312fc3
|
@ -92,8 +92,10 @@ class DataClassWriter {
|
||||||
..write('});');
|
..write('});');
|
||||||
|
|
||||||
if (isInsertable) {
|
if (isInsertable) {
|
||||||
|
// If we generate mixins for the `toColumns` override, we don't need to
|
||||||
|
// generate a duplicate method in the data class.
|
||||||
if (!scope.options.writeToColumnsMixins) {
|
if (!scope.options.writeToColumnsMixins) {
|
||||||
_writeToColumnsOverride();
|
_emitter.writeToColumnsOverride(columns);
|
||||||
}
|
}
|
||||||
if (scope.options.dataClassToCompanions) {
|
if (scope.options.dataClassToCompanions) {
|
||||||
_writeToCompanion();
|
_writeToCompanion();
|
||||||
|
@ -245,63 +247,6 @@ class DataClassWriter {
|
||||||
_buffer.write(');');
|
_buffer.write(');');
|
||||||
}
|
}
|
||||||
|
|
||||||
void _writeToColumnsOverride() {
|
|
||||||
final expression = _emitter.drift('Expression');
|
|
||||||
final variable = _emitter.drift('Variable');
|
|
||||||
|
|
||||||
_buffer
|
|
||||||
..write('@override\nMap<String, $expression> toColumns'
|
|
||||||
'(bool nullToAbsent) {\n')
|
|
||||||
..write('final map = <String, $expression> {};');
|
|
||||||
|
|
||||||
for (final column in columns) {
|
|
||||||
// Generated column - cannot be used for inserts or updates
|
|
||||||
if (column.isGenerated) continue;
|
|
||||||
|
|
||||||
// We include all columns that are not null. If nullToAbsent is false, we
|
|
||||||
// also include null columns. When generating NNBD code, we can include
|
|
||||||
// non-nullable columns without an additional null check since we know
|
|
||||||
// the values aren't going to be null.
|
|
||||||
final needsNullCheck = column.nullableInDart;
|
|
||||||
final needsScope = needsNullCheck || column.typeConverter != null;
|
|
||||||
if (needsNullCheck) {
|
|
||||||
_buffer.write('if (!nullToAbsent || ${column.nameInDart} != null)');
|
|
||||||
}
|
|
||||||
if (needsScope) _buffer.write('{');
|
|
||||||
|
|
||||||
final typeName =
|
|
||||||
_emitter.dartCode(_emitter.variableTypeCode(column, nullable: false));
|
|
||||||
final mapSetter = 'map[${asDartLiteral(column.nameInSql)}] = '
|
|
||||||
'$variable<$typeName>';
|
|
||||||
|
|
||||||
if (column.typeConverter != null) {
|
|
||||||
// apply type converter before writing the variable
|
|
||||||
final converter = column.typeConverter!;
|
|
||||||
|
|
||||||
_emitter
|
|
||||||
..write('final converter = ')
|
|
||||||
..writeDart(_emitter.writer
|
|
||||||
.readConverter(converter, forNullable: column.nullable))
|
|
||||||
..writeln(';')
|
|
||||||
..write(mapSetter)
|
|
||||||
..write('(converter.toSql(${column.nameInDart})');
|
|
||||||
_buffer.write(');');
|
|
||||||
} else {
|
|
||||||
// no type converter. Write variable directly
|
|
||||||
_buffer
|
|
||||||
..write(mapSetter)
|
|
||||||
..write('(')
|
|
||||||
..write(column.nameInDart)
|
|
||||||
..write(');');
|
|
||||||
}
|
|
||||||
|
|
||||||
// This one closes the optional if from before.
|
|
||||||
if (needsScope) _buffer.write('}');
|
|
||||||
}
|
|
||||||
|
|
||||||
_buffer.write('return map; \n}\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void _writeToCompanion() {
|
void _writeToCompanion() {
|
||||||
final asTable = table as DriftTable;
|
final asTable = table as DriftTable;
|
||||||
final companionType = _emitter.writer.companionType(asTable);
|
final companionType = _emitter.writer.companionType(asTable);
|
||||||
|
@ -424,3 +369,59 @@ class RowMappingWriter {
|
||||||
buffer.write(')');
|
buffer.write(')');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension WriteToColumns on TextEmitter {
|
||||||
|
void writeToColumnsOverride(Iterable<DriftColumn> columns) {
|
||||||
|
final expression = drift('Expression');
|
||||||
|
final variable = drift('Variable');
|
||||||
|
|
||||||
|
this
|
||||||
|
..write('@override\nMap<String, $expression> toColumns'
|
||||||
|
'(bool nullToAbsent) {\n')
|
||||||
|
..write('final map = <String, $expression> {};');
|
||||||
|
|
||||||
|
for (final column in columns) {
|
||||||
|
// Generated column - cannot be used for inserts or updates
|
||||||
|
if (column.isGenerated) continue;
|
||||||
|
|
||||||
|
// We include all columns that are not null. If nullToAbsent is false, we
|
||||||
|
// also include null columns. When generating NNBD code, we can include
|
||||||
|
// non-nullable columns without an additional null check since we know
|
||||||
|
// the values aren't going to be null.
|
||||||
|
final needsNullCheck = column.nullableInDart;
|
||||||
|
final needsScope = needsNullCheck || column.typeConverter != null;
|
||||||
|
if (needsNullCheck) {
|
||||||
|
write('if (!nullToAbsent || ${column.nameInDart} != null)');
|
||||||
|
}
|
||||||
|
if (needsScope) write('{');
|
||||||
|
|
||||||
|
final typeName = dartCode(variableTypeCode(column, nullable: false));
|
||||||
|
final mapSetter = 'map[${asDartLiteral(column.nameInSql)}] = '
|
||||||
|
'$variable<$typeName>';
|
||||||
|
|
||||||
|
if (column.typeConverter != null) {
|
||||||
|
// apply type converter before writing the variable
|
||||||
|
final converter = column.typeConverter!;
|
||||||
|
|
||||||
|
this
|
||||||
|
..write('final converter = ')
|
||||||
|
..writeDart(readConverter(converter, forNullable: column.nullable))
|
||||||
|
..writeln(';')
|
||||||
|
..write(mapSetter)
|
||||||
|
..write('(converter.toSql(${column.nameInDart}));');
|
||||||
|
} else {
|
||||||
|
// no type converter. Write variable directly
|
||||||
|
this
|
||||||
|
..write(mapSetter)
|
||||||
|
..write('(')
|
||||||
|
..write(column.nameInDart)
|
||||||
|
..write(');');
|
||||||
|
}
|
||||||
|
|
||||||
|
// This one closes the optional if from before.
|
||||||
|
if (needsScope) write('}');
|
||||||
|
}
|
||||||
|
|
||||||
|
write('return map; \n}\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -380,67 +380,10 @@ class TableWriter extends TableOrViewWriter {
|
||||||
buffer.writeln('$typeName get ${column.nameInDart};');
|
buffer.writeln('$typeName get ${column.nameInDart};');
|
||||||
}
|
}
|
||||||
|
|
||||||
_writeToColumnsOverride();
|
emitter.writeToColumnsOverride(table.columns);
|
||||||
buffer.write('}');
|
buffer.write('}');
|
||||||
}
|
}
|
||||||
|
|
||||||
void _writeToColumnsOverride() {
|
|
||||||
final expression = emitter.drift('Expression');
|
|
||||||
final variable = emitter.drift('Variable');
|
|
||||||
|
|
||||||
buffer
|
|
||||||
..write('@override\nMap<String, $expression> toColumns'
|
|
||||||
'(bool nullToAbsent) {\n')
|
|
||||||
..write('final map = <String, $expression> {};');
|
|
||||||
|
|
||||||
for (final column in table.columns) {
|
|
||||||
// Generated column - cannot be used for inserts or updates
|
|
||||||
if (column.isGenerated) continue;
|
|
||||||
|
|
||||||
// We include all columns that are not null. If nullToAbsent is false, we
|
|
||||||
// also include null columns. When generating NNBD code, we can include
|
|
||||||
// non-nullable columns without an additional null check since we know
|
|
||||||
// the values aren't going to be null.
|
|
||||||
final needsNullCheck = column.nullableInDart;
|
|
||||||
final needsScope = needsNullCheck || column.typeConverter != null;
|
|
||||||
if (needsNullCheck) {
|
|
||||||
buffer.write('if (!nullToAbsent || ${column.nameInDart} != null)');
|
|
||||||
}
|
|
||||||
if (needsScope) buffer.write('{');
|
|
||||||
|
|
||||||
final typeName =
|
|
||||||
emitter.dartCode(emitter.variableTypeCode(column, nullable: false));
|
|
||||||
final mapSetter = 'map[${asDartLiteral(column.nameInSql)}] = '
|
|
||||||
'$variable<$typeName>';
|
|
||||||
|
|
||||||
if (column.typeConverter != null) {
|
|
||||||
// apply type converter before writing the variable
|
|
||||||
final converter = column.typeConverter!;
|
|
||||||
|
|
||||||
emitter
|
|
||||||
..write('final converter = ')
|
|
||||||
..writeDart(emitter.writer
|
|
||||||
.readConverter(converter, forNullable: column.nullable))
|
|
||||||
..writeln(';')
|
|
||||||
..write(mapSetter)
|
|
||||||
..write('(converter.toSql(${column.nameInDart})');
|
|
||||||
buffer.write(');');
|
|
||||||
} else {
|
|
||||||
// no type converter. Write variable directly
|
|
||||||
buffer
|
|
||||||
..write(mapSetter)
|
|
||||||
..write('(')
|
|
||||||
..write(column.nameInDart)
|
|
||||||
..write(');');
|
|
||||||
}
|
|
||||||
|
|
||||||
// This one closes the optional if from before.
|
|
||||||
if (needsScope) buffer.write('}');
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer.write('return map; \n}\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void _writeConvertersAsStaticFields() {
|
void _writeConvertersAsStaticFields() {
|
||||||
for (final converter in table.appliedConverters) {
|
for (final converter in table.appliedConverters) {
|
||||||
final typeName =
|
final typeName =
|
||||||
|
|
Loading…
Reference in New Issue