/* Generated By:JJTree: Do not edit this line. OModifier.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=true,TRACK_TOKENS=true,NODE_PREFIX=O,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
package com.orientechnologies.orient.core.sql.parser;
import com.orientechnologies.orient.core.command.OCommandContext;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class OModifier extends SimpleNode {
boolean squareBrackets = false;
OArrayRangeSelector arrayRange;
OOrBlock condition;
OArraySingleValuesSelector arraySingleValues;
OMethodCall methodCall;
OSuffixIdentifier suffix;
OModifier next;
public OModifier(int id) {
super(id);
}
public OModifier(OrientSql p, int id) {
super(p, id);
}
/** Accept the visitor. **/
public Object jjtAccept(OrientSqlVisitor visitor, Object data) {
return visitor.visit(this, data);
}
public void toString(Map<Object, Object> params, StringBuilder builder) {
if (squareBrackets) {
builder.append("[");
if (arrayRange != null) {
arrayRange.toString(params, builder);
} else if (condition != null) {
condition.toString(params, builder);
} else if (arraySingleValues != null) {
arraySingleValues.toString(params, builder);
}
builder.append("]");
} else if (methodCall != null) {
methodCall.toString(params, builder);
} else if (suffix != null) {
builder.append(".");
suffix.toString(params, builder);
}
if (next != null) {
next.toString(params, builder);
}
}
public Object execute(OIdentifiable iCurrentRecord, Object result, OCommandContext ctx) {
if (methodCall != null) {
result = methodCall.execute(result, ctx);
} else if (suffix != null) {
result = suffix.execute(result, ctx);
} else if (arrayRange != null) {
result = arrayRange.execute(iCurrentRecord, result, ctx);
} else if (condition != null) {
result = filterByCondition(iCurrentRecord, result, ctx);
} else if (arraySingleValues != null) {
result = arraySingleValues.execute(iCurrentRecord, result, ctx);
}
if (next != null) {
result = next.execute(iCurrentRecord, result, ctx);
}
return result;
}
private Object filterByCondition(OIdentifiable iCurrentRecord, Object iResult, OCommandContext ctx) {
if(iResult==null){
return null;
}
List<Object> result = new ArrayList<Object>();
if(iResult.getClass().isArray()){
for(int i=0;i< Array.getLength(iResult); i++){
Object item = Array.get(iResult, i);
if(condition.evaluate(item, ctx)){
result.add(item);
}
}
return result;
}
if(iResult instanceof Iterable){
iResult = ((Iterable) iResult).iterator();
}
if(iResult instanceof Iterator){
while(((Iterator) iResult).hasNext()){
Object item = ((Iterator) iResult).next();
if(condition.evaluate(item, ctx)){
result.add(item);
}
}
}
return result;
}
}
/* JavaCC - OriginalChecksum=39c21495d02f9b5007b4a2d6915496e1 (do not edit this line) */