| package edu.uci.ics.asterix.runtime.evaluators.functions; |
| |
| import edu.uci.ics.asterix.common.functions.FunctionConstants; |
| import edu.uci.ics.asterix.om.functions.IFunctionDescriptor; |
| import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory; |
| import edu.uci.ics.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; |
| import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; |
| import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; |
| import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluator; |
| import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory; |
| import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable; |
| import edu.uci.ics.hyracks.dataflow.common.data.accessors.ArrayBackedValueStorage; |
| import edu.uci.ics.hyracks.dataflow.common.data.accessors.IDataOutputProvider; |
| import java.io.DataOutput; |
| |
| /** |
| * |
| * @author Xiaoyu Ma |
| */ |
| public class StringEqualDescriptor extends AbstractScalarFunctionDynamicDescriptor { |
| private static final long serialVersionUID = 1L; |
| |
| private final static FunctionIdentifier FID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string-equal", 2, |
| true); |
| public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { |
| public IFunctionDescriptor createFunctionDescriptor() { |
| return new StringEqualDescriptor(); |
| } |
| }; |
| @Override |
| public ICopyEvaluatorFactory createEvaluatorFactory(final ICopyEvaluatorFactory[] args) throws AlgebricksException { |
| |
| return new ICopyEvaluatorFactory() { |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| public ICopyEvaluator createEvaluator(IDataOutputProvider output) throws AlgebricksException { |
| |
| DataOutput dout = output.getDataOutput(); |
| |
| return new AbstractBinaryStringBoolEval(dout, args[0], args[1]) { |
| |
| @Override |
| protected boolean compute(byte[] lBytes, int lLen, int lStart, |
| byte[] rBytes, int rLen, int rStart, |
| ArrayBackedValueStorage array0, ArrayBackedValueStorage array1) { |
| int len = UTF8StringPointable.getUTFLength(lBytes, 1); |
| |
| if(len != UTF8StringPointable.getUTFLength(rBytes, 1)) |
| return false; |
| |
| int pos = 3; |
| while(pos < len + 3) { |
| char c1 = UTF8StringPointable.charAt(lBytes, pos); |
| char c2 = UTF8StringPointable.charAt(rBytes, pos); |
| if(c1 != c2) |
| return false; |
| |
| pos += UTF8StringPointable.charSize(lBytes, pos); |
| } |
| |
| return true; |
| } |
| |
| }; |
| } |
| }; |
| } |
| |
| @Override |
| public FunctionIdentifier getIdentifier() { |
| return FID; |
| } |
| } |