package com.orientechnologies.orient.core.sql;
import com.orientechnologies.orient.core.command.OCommandDistributedReplicateRequest;
import com.orientechnologies.orient.core.command.OCommandRequest;
import com.orientechnologies.orient.core.command.OCommandRequestText;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.exception.OCommandExecutionException;
import com.orientechnologies.orient.core.metadata.sequence.OSequence;
import com.orientechnologies.orient.core.metadata.sequence.OSequence.SEQUENCE_TYPE;
import com.orientechnologies.orient.core.metadata.sequence.OSequenceHelper;
import java.util.Arrays;
import java.util.Map;
/**
* @author Matan Shukry (matanshukry@gmail.com)
* @since 2/28/2015
*/
public class OCommandExecutorSQLCreateSequence extends OCommandExecutorSQLAbstract implements OCommandDistributedReplicateRequest {
public static final String KEYWORD_CREATE = "CREATE";
public static final String KEYWORD_SEQUENCE = "SEQUENCE";
public static final String KEYWORD_TYPE = "TYPE";
public static final String KEYWORD_START = "START";
public static final String KEYWORD_INCREMENT = "INCREMENT";
public static final String KEYWORD_CACHE = "CACHE";
private String sequenceName;
private SEQUENCE_TYPE sequenceType;
private OSequence.CreateParams params;
@Override public OCommandExecutorSQLCreateSequence parse(OCommandRequest iRequest) {
final OCommandRequestText textRequest = (OCommandRequestText) iRequest;
String queryText = textRequest.getText();
String originalQuery = queryText;
try {
queryText = preParse(queryText, iRequest);
textRequest.setText(queryText);
init((OCommandRequestText) iRequest);
parserRequiredKeyword(KEYWORD_CREATE);
parserRequiredKeyword(KEYWORD_SEQUENCE);
this.sequenceName = parserRequiredWord(false, "Expected <sequence name>");
this.params = new OSequence.CreateParams().setDefaults();
String temp;
while ((temp = parseOptionalWord(true)) != null) {
if (parserIsEnded()) {
break;
}
if (temp.equals(KEYWORD_TYPE)) {
String typeAsString = parserRequiredWord(true, "Expected <sequence type>");
try {
this.sequenceType = OSequenceHelper.getSequenceTyeFromString(typeAsString);
} catch (IllegalArgumentException e) {
throw new OCommandSQLParsingException(
"Unknown sequence type '" + typeAsString + "'. Supported attributes are: " + Arrays
.toString(SEQUENCE_TYPE.values()));
}
} else if (temp.equals(KEYWORD_START)) {
String startAsString = parserRequiredWord(true, "Expected <start value>");
this.params.start = Long.parseLong(startAsString);
} else if (temp.equals(KEYWORD_INCREMENT)) {
String incrementAsString = parserRequiredWord(true, "Expected <increment value>");
this.params.increment = Integer.parseInt(incrementAsString);
} else if (temp.equals(KEYWORD_CACHE)) {
String cacheAsString = parserRequiredWord(true, "Expected <cache value>");
this.params.cacheSize = Integer.parseInt(cacheAsString);
}
}
if (this.sequenceType == null) {
this.sequenceType = OSequenceHelper.DEFAULT_SEQUENCE_TYPE;
}
} finally {
textRequest.setText(originalQuery);
}
return this;
}
@Override public Object execute(Map<Object, Object> iArgs) {
if (this.sequenceName == null) {
throw new OCommandExecutionException("Cannot execute the command because it has not been parsed yet");
}
final ODatabaseDocument database = getDatabase();
database.getMetadata().getSequenceLibrary().createSequence(this.sequenceName, this.sequenceType, this.params);
return database.getMetadata().getSequenceLibrary().getSequenceCount();
}
@Override public String getSyntax() {
return "CREATE SEQUENCE <sequence> [TYPE <CACHED|ORDERED>] [START <value>] [INCREMENT <value>] [CACHE <value>]";
}
@Override public QUORUM_TYPE getQuorumType() {
return QUORUM_TYPE.ALL;
}
}