package org.orienteer.devutils;
import java.util.regex.Pattern;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.io.IOUtils;
import org.apache.wicket.util.string.Strings;
import com.google.common.base.Throwables;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.OCommandSQLParsingException;
import com.orientechnologies.orient.core.sql.query.OResultSet;
import ru.ydn.wicket.wicketconsole.IScriptEngine;
import ru.ydn.wicket.wicketconsole.ScriptResult;
import ru.ydn.wicket.wicketorientdb.OrientDbWebSession;
import ru.ydn.wicket.wicketorientdb.model.OQueryModel;
/**
* {@link IScriptEngine} for execution of SQL in OrientDB
*/
public class ODBScriptEngine implements IScriptEngine {
private static final Pattern SELECT_FROM_PATTERN = Pattern.compile("^select\\s+from", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
@Override
public String getName() {
return ODBScriptEngineFactory.ENGINE_NAME;
}
@SuppressWarnings("unchecked")
@Override
public ScriptResult eval(String command) {
ScriptResult result = new ScriptResult(ODBScriptEngineFactory.ENGINE_NAME, command);
if(!Strings.isEmpty(command)) {
command = command.trim();
try {
if(SELECT_FROM_PATTERN.matcher(command).find()) {
OQueryModel<ODocument> returnModel = new OQueryModel<ODocument>(command);
returnModel.probeOClass(10);
result.setResultModel(returnModel);
} else {
ODatabaseDocument db = OrientDbWebSession.get().getDatabase();
OCommandSQL comm = new OCommandSQL(command);
Object resultObject = db.command(comm).execute();
if(resultObject instanceof OResultSet) {
StringBuilder sb = new StringBuilder("[");
boolean first = true;
for(ODocument doc : ((OResultSet<ODocument>)resultObject)) {
if(!first) sb.append(", ");
sb.append(doc.toJSON());
first=false;
}
sb.append("]");
resultObject = sb.toString();
}
result.setResult(resultObject);
}
} catch (Exception e) {
if(shouldBeShorted(e)) {
result.setError(e.getMessage());
} else {
result.setError(Throwables.getStackTraceAsString(e));
}
}
}
return result;
}
protected boolean shouldBeShorted(Exception e) {
return e instanceof OCommandSQLParsingException;
}
}