/* Generated By:JJTree: Do not edit this line. OArrayRangeSelector.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.common.collection.OMultiValue;
import com.orientechnologies.orient.core.command.OCommandContext;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import java.util.Arrays;
import java.util.Map;
public class OArrayRangeSelector extends SimpleNode {
protected Integer from;
protected Integer to;
boolean newRange = false;
protected OArrayNumberSelector fromSelector;
protected OArrayNumberSelector toSelector;
public OArrayRangeSelector(int id) {
super(id);
}
public OArrayRangeSelector(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 (from != null) {
builder.append(from);
} else {
fromSelector.toString(params, builder);
}
if (newRange) {
builder.append("-");
// TODO in 3.0 result.append("..");
} else {
builder.append("-");
}
if (to != null) {
builder.append(to);
} else {
toSelector.toString(params, builder);
}
}
public Object execute(OIdentifiable iCurrentRecord, Object result, OCommandContext ctx) {
if (result == null) {
return null;
}
if (!OMultiValue.isMultiValue(result)) {
return null;
}
Integer lFrom = from;
if (fromSelector != null) {
lFrom = fromSelector.getValue(iCurrentRecord, result, ctx);
}
if (lFrom == null) {
lFrom = 0;
}
Integer lTo = to;
if (toSelector != null) {
lTo = toSelector.getValue(iCurrentRecord, result, ctx);
}
if (lFrom > lTo) {
return null;
}
Object[] arrayResult = OMultiValue.array(result);
if (arrayResult == null || arrayResult.length == 0) {
return arrayResult;
}
lFrom = Math.max(lFrom, 0);
if (arrayResult.length < lFrom) {
return null;
}
lFrom = Math.min(lFrom, arrayResult.length - 1);
lTo = Math.min(lTo, arrayResult.length);
return Arrays.asList(Arrays.copyOfRange(arrayResult, lFrom, lTo));
}
}
/* JavaCC - OriginalChecksum=594a372e31fcbcd3ed962c2260e76468 (do not edit this line) */