Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changed what sequence attributes are included in diff/generate changelog for Snowflake #3121

Merged
merged 2 commits into from Aug 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,47 @@
package liquibase.diff.output.changelog.core;

import liquibase.change.Change;
import liquibase.change.core.AlterSequenceChange;
import liquibase.database.Database;
import liquibase.database.core.SnowflakeDatabase;
import liquibase.diff.ObjectDifferences;
import liquibase.diff.output.DiffOutputControl;
import liquibase.diff.output.changelog.ChangeGeneratorChain;
import liquibase.structure.DatabaseObject;
import liquibase.structure.core.Sequence;

import java.util.ArrayList;
import java.util.List;

public class ChangedSequenceChangeGeneratorSnowflake extends ChangedSequenceChangeGenerator{
yodzhubeiskyi marked this conversation as resolved.
Show resolved Hide resolved

@Override
public int getPriority(Class<? extends DatabaseObject> objectType, Database database) {
int priority = super.getPriority(objectType, database);
if ((Sequence.class.isAssignableFrom(objectType)) && (database instanceof SnowflakeDatabase)) {
priority += PRIORITY_DATABASE;
}
return priority;
}

@Override
public Change[] fixChanged(DatabaseObject changedObject, ObjectDifferences differences, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
Sequence sequence = (Sequence) changedObject;

List<Change> changes = new ArrayList<>();
AlterSequenceChange accumulatedChange = createAlterSequenceChange(sequence, control);

if (differences.isDifferent("incrementBy")) {
AlterSequenceChange change = createAlterSequenceChange(sequence, control);
change.setIncrementBy(sequence.getIncrementBy());
accumulatedChange.setIncrementBy(sequence.getIncrementBy());
changes.add(change);
}

if (changes.isEmpty()) {
return null;
} else {
return changes.toArray(new Change[changes.size()]);
}
}
}
@@ -0,0 +1,41 @@
package liquibase.diff.output.changelog.core;

import liquibase.change.Change;
import liquibase.change.core.CreateSequenceChange;
import liquibase.database.Database;
import liquibase.database.core.SnowflakeDatabase;
import liquibase.diff.output.DiffOutputControl;
import liquibase.diff.output.changelog.ChangeGeneratorChain;
import liquibase.structure.DatabaseObject;
import liquibase.structure.core.Sequence;

public class MissingSequenceChangeGeneratorSnowflake extends MissingSequenceChangeGenerator{
yodzhubeiskyi marked this conversation as resolved.
Show resolved Hide resolved

@Override
public int getPriority(Class<? extends DatabaseObject> objectType, Database database) {
int priority = super.getPriority(objectType, database);
if ((Sequence.class.isAssignableFrom(objectType)) && (database instanceof SnowflakeDatabase)) {
priority += PRIORITY_DATABASE;
}
return priority;
}

@Override
public Change[] fixMissing(DatabaseObject missingObject, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) {
Sequence sequence = (Sequence) missingObject;

CreateSequenceChange change = new CreateSequenceChange();
change.setSequenceName(sequence.getName());
if (control.getIncludeCatalog()) {
change.setCatalogName(sequence.getSchema().getCatalogName());
}
if (control.getIncludeSchema()) {
KushnirykOleh marked this conversation as resolved.
Show resolved Hide resolved
change.setSchemaName(sequence.getSchema().getName());
}
change.setStartValue(sequence.getStartValue());
change.setIncrementBy(sequence.getIncrementBy());

return new Change[] { change };

}
}
@@ -0,0 +1,54 @@
package liquibase.sqlgenerator.core;

import liquibase.database.Database;
import liquibase.database.core.*;
import liquibase.exception.ValidationErrors;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.statement.core.CreateSequenceStatement;

public class CreateSequenceGeneratorSnowflake extends CreateSequenceGenerator{
yodzhubeiskyi marked this conversation as resolved.
Show resolved Hide resolved

@Override
public int getPriority() {
return PRIORITY_DATABASE;
}

@Override
public boolean supports(CreateSequenceStatement statement, Database database) {
return database instanceof SnowflakeDatabase;
}

@Override
public ValidationErrors validate(CreateSequenceStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
ValidationErrors validationErrors = new ValidationErrors();

validationErrors.checkRequiredField("sequenceName", statement.getSequenceName());

validationErrors.checkDisallowedField("minValue", statement.getMinValue(), database, SnowflakeDatabase.class);
validationErrors.checkDisallowedField("maxValue", statement.getMaxValue(), database, SnowflakeDatabase.class);
validationErrors.checkDisallowedField("cacheSize", statement.getCacheSize(), database, SnowflakeDatabase.class);
validationErrors.checkDisallowedField("cycle", statement.getCycle(), database, SnowflakeDatabase.class);
validationErrors.checkDisallowedField("datatype", statement.getDataType(), database, SnowflakeDatabase.class);
validationErrors.checkDisallowedField("ordered", statement.getOrdered(), database, SnowflakeDatabase.class);

return validationErrors;
}

@Override
public Sql[] generateSql(CreateSequenceStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
StringBuilder queryStringBuilder = new StringBuilder();
queryStringBuilder.append("CREATE SEQUENCE ");
queryStringBuilder.append(database.escapeSequenceName(statement.getCatalogName(), statement.getSchemaName(), statement.getSequenceName()));
if (database instanceof SnowflakeDatabase) {
if (statement.getStartValue() != null) {
queryStringBuilder.append(" START WITH ").append(statement.getStartValue());
}
if (statement.getIncrementBy() != null) {
queryStringBuilder.append(" INCREMENT BY ").append(statement.getIncrementBy());
}
}
return new Sql[]{new UnparsedSql(queryStringBuilder.toString(), getAffectedSequence(statement))};
}
}
@@ -0,0 +1,2 @@
liquibase.diff.output.changelog.core.ChangedSequenceChangeGeneratorSnowflake
liquibase.diff.output.changelog.core.MissingSequenceChangeGeneratorSnowflake
@@ -1,3 +1,4 @@
liquibase.sqlgenerator.core.CreateSequenceGeneratorSnowflake
liquibase.sqlgenerator.core.DropDefaultValueGeneratorSnowflake
liquibase.sqlgenerator.core.DropProcedureGeneratorSnowflake
liquibase.sqlgenerator.core.InsertOrUpdateGeneratorSnowflake
Expand Down