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

Add support for all available options for CreateCollectionChange #78

Merged
merged 2 commits into from
Jan 24, 2021
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@


@DatabaseChange(name = "createCollection",
description = "Create collection with validation " +
"https://docs.mongodb.com/manual/reference/method/db.createCollection/#db.createCollection",
description = "Create collection. Supports all options available: " +
"https://docs.mongodb.com/manual/reference/method/db.createCollection/#db.createCollection\n" +
"https://docs.mongodb.com/manual/reference/method/db.runCommand/#db.runCommand",
priority = ChangeMetaData.PRIORITY_DEFAULT, appliesTo = "collection")
@NoArgsConstructor
@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import java.util.List;

import static java.lang.Boolean.TRUE;
import static java.util.Optional.ofNullable;

public class AdjustChangeLogCollectionStatement extends RunCommandStatement {

Expand Down Expand Up @@ -87,4 +88,18 @@ private void adjustIndexes(final MongoConnection connection) {
collection.createIndex(keys, options);
}
}

@Override
public String toJs() {
return SHELL_DB_PREFIX
+ getCommandName()
+ "("
+ ofNullable(command).map(Document::toJson).orElse(null)
+ ");";
}

@Override
public Document run(final MongoConnection connection) {
return connection.getDatabase().runCommand(command);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
import liquibase.ext.mongodb.database.MongoConnection;
import liquibase.ext.mongodb.statement.RunCommandStatement;
import lombok.Getter;
import org.bson.Document;

import static java.lang.Boolean.TRUE;
import static java.util.Optional.ofNullable;

public class AdjustChangeLogLockCollectionStatement extends RunCommandStatement {

Expand Down Expand Up @@ -59,4 +61,18 @@ public void execute(final MongoConnection connection) {
super.execute(connection);
}
}

@Override
public String toJs() {
return SHELL_DB_PREFIX
+ getCommandName()
+ "("
+ ofNullable(command).map(Document::toJson).orElse(null)
+ ");";
}

@Override
public Document run(final MongoConnection connection) {
return connection.getDatabase().runCommand(command);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ public abstract class AbstractCollectionStatement extends AbstractNoSqlStatement
@Getter
protected final String collectionName;

/**
* Provides a pseudo javascript representation of the collection related statement
* (for example that can be ran in the mongo shell.
* Exceptions examples are count which uses db.getCollectionNames however filters programmatically by name).
* @return javascript version of the full command
*/
@Override
public String toJs() {
return "db." +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,44 @@
import liquibase.ext.mongodb.database.MongoConnection;
import liquibase.nosql.statement.AbstractNoSqlStatement;
import liquibase.nosql.statement.NoSqlExecuteStatement;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.bson.Document;

public abstract class AbstractMongoDocumentStatement<T extends Document> extends AbstractNoSqlStatement
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public abstract class AbstractRunCommandStatement extends AbstractNoSqlStatement
implements NoSqlExecuteStatement<MongoConnection> {

public abstract T run(MongoConnection connection);
public static final String COMMAND_NAME = "runCommand";
public static final String SHELL_DB_PREFIX = "db.";

@Getter
protected final Document command;

@Override
public void execute(final MongoConnection connection) {
run(connection);
}

public Document run(final MongoConnection connection) {
return connection.getDatabase().runCommand(command);
}

@Override
public String getCommandName() {
return COMMAND_NAME;
}

@Override
public String toJs() {
return SHELL_DB_PREFIX
+ getCommandName()
+ "("
+ BsonUtils.toJson(command)
+ ");";
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import lombok.Getter;
import org.bson.Document;

import static java.util.Optional.ofNullable;

@Getter
@EqualsAndHashCode(callSuper = true)
public class AdminCommandStatement extends RunCommandStatement {
Expand Down
41 changes: 11 additions & 30 deletions src/main/java/liquibase/ext/mongodb/statement/BsonUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,7 @@

import com.mongodb.DBRefCodecProvider;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.model.CreateCollectionOptions;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.ValidationAction;
import com.mongodb.client.model.ValidationLevel;
import com.mongodb.client.model.ValidationOptions;
import lombok.NoArgsConstructor;
import org.bson.Document;
import org.bson.UuidRepresentation;
Expand Down Expand Up @@ -85,32 +81,6 @@ public static List<Document> orEmptyList(final String json) {
);
}

public static CreateCollectionOptions orEmptyCreateCollectionOptions(final Document options) {
final CreateCollectionOptions createCollectionOptions =
new CreateCollectionOptions();

if (nonNull(options)) {
final ValidationAction
validationAction =
ofNullable(options.getString("validationAction"))
.map(ValidationAction::fromString)
.orElse(null);

final ValidationLevel
validationLevel =
ofNullable(options.getString("validationLevel"))
.map(ValidationLevel::fromString)
.orElse(null);

createCollectionOptions.validationOptions(
new ValidationOptions()
.validationAction(validationAction)
.validationLevel(validationLevel)
.validator(options.get("validator", Document.class)));
}
return createCollectionOptions;
}

public static IndexOptions orEmptyIndexOptions(final Document options) {
//TODO: add POJO codec
final IndexOptions indexOptions = new IndexOptions();
Expand All @@ -126,4 +96,15 @@ public static IndexOptions orEmptyIndexOptions(final Document options) {
return indexOptions;
}

public static String toJson(final Document document) {
return ofNullable(document).map(Document::toJson).orElse(null);
}

public static Document toCommand(final String commandName, final Object commandValue, final Document options) {
final Document command = new Document(commandName, commandValue);
if (nonNull(options)) {
command.putAll(options);
}
return command;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

import liquibase.ext.mongodb.database.MongoConnection;
import liquibase.nosql.statement.NoSqlQueryForLongStatement;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;

Expand All @@ -33,7 +32,7 @@
public class CountCollectionByNameStatement extends AbstractCollectionStatement
implements NoSqlQueryForLongStatement<MongoConnection> {

public static final String COMMAND_NAME = "countCollectionByNames";
public static final String COMMAND_NAME = "getCollectionNames";

public CountCollectionByNameStatement(final String collectionName) {
super(collectionName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,54 +20,32 @@
* #L%
*/

import com.mongodb.client.model.CreateCollectionOptions;
import liquibase.ext.mongodb.database.MongoConnection;
import liquibase.nosql.statement.NoSqlExecuteStatement;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.bson.Document;

import static java.util.Optional.ofNullable;

/**
* Creates a collection via the database runCommand method
* For a list of supported options see the reference page:
* https://docs.mongodb.com/manual/reference/command/create/#create
*/
@Getter
@EqualsAndHashCode(callSuper = true)
public class CreateCollectionStatement extends AbstractCollectionStatement
implements NoSqlExecuteStatement<MongoConnection> {

public static final String COMMAND_NAME = "createCollection";
public class CreateCollectionStatement extends AbstractRunCommandStatement {

protected Document options;
public static final String RUN_COMMAND_NAME = "create";

public CreateCollectionStatement(final String collectionName, final String options) {
this(collectionName, BsonUtils.orEmptyDocument(options));
}

public CreateCollectionStatement(final String collectionName, final Document options) {
super(collectionName);
this.options = options;
super(BsonUtils.toCommand(RUN_COMMAND_NAME, collectionName, options));
}

@Override
public String getCommandName() {
return COMMAND_NAME;
}

@Override
public String toJs() {
return
"db."
+ getCommandName()
+ "("
+ getCollectionName()
+ ", "
+ ofNullable(options).map(Document::toJson).orElse(null)
+ ");";
}

@Override
public void execute(final MongoConnection connection) {
final CreateCollectionOptions createCollectionOptions = BsonUtils.orEmptyCreateCollectionOptions(options);
connection.getDatabase().createCollection(getCollectionName(), createCollectionOptions);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,47 +20,18 @@
* #L%
*/

import liquibase.ext.mongodb.database.MongoConnection;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.bson.Document;

import static java.util.Optional.ofNullable;

@Getter
@EqualsAndHashCode(callSuper = true)
public class RunCommandStatement extends AbstractMongoDocumentStatement<Document> {

public static final String COMMAND_NAME = "runCommand";

protected Document command;
public class RunCommandStatement extends AbstractRunCommandStatement {

public RunCommandStatement(final String command) {
this(BsonUtils.orEmptyDocument(command));
}

public RunCommandStatement(final Document command) {
this.command = command;
}

@Override
public String getCommandName() {
return COMMAND_NAME;
}

@Override
public String toJs() {
return
"db."
+ getCommandName()
+ "("
+ ofNullable(command).map(Document::toJson).orElse(null)
+ ");";
}

@Override
public Document run(final MongoConnection connection) {
return connection.getDatabase().runCommand(command);
super(command);
}

}
12 changes: 12 additions & 0 deletions src/test/java/liquibase/ext/mongodb/TestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,16 @@ public static List<ChangeSet> getChangesets(final String changeSetPath, final Mo
parser.parse(changeSetPath, new ChangeLogParameters(database), resourceAccessor);
return changeLog.getChangeSets();
}

/**
* Helper to format and convert a string containing single quotes to one with double quotes.
* Use this to declare readable strings in tests
* @param singleQuoted a string containing single quotes
* @param args format args
* @return original string formatted with double quotes
*/
public static final String formatDoubleQuoted(final String singleQuoted, final String... args) {
String formatted = String.format(singleQuoted, args);
return formatted.replaceAll("'","\"");
}
}
Loading