You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by ji...@apache.org on 2015/10/29 05:44:55 UTC

[04/15] incubator-asterixdb git commit: ASTERIXDB-1102: VarSize Encoding to store length of String and ByteArray

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
index d951415..97bcd02 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APoint3DConstructorDescriptor.java
@@ -37,6 +37,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -72,6 +73,7 @@ public class APoint3DConstructorDescriptor extends AbstractScalarFunctionDynamic
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -81,7 +83,8 @@ public class APoint3DConstructorDescriptor extends AbstractScalarFunctionDynamic
                             eval.evaluate(tuple);
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == SER_STRING_TYPE_TAG) {
-                                String s = new String(serString, 3, outInput.getLength() - 3, "UTF-8");
+                                utf8Ptr.set(serString, 1, outInput.getLength()-1);
+                                String s = utf8Ptr.toString();
                                 int firstCommaIndex = s.indexOf(',');
                                 int secondCommaIndex = s.indexOf(',', firstCommaIndex + 1);
                                 aPoint3D.setValue(Double.parseDouble(s.substring(0, firstCommaIndex)),

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
index a7b47f3..49781d5 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APointConstructorDescriptor.java
@@ -37,6 +37,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -72,6 +73,7 @@ public class APointConstructorDescriptor extends AbstractScalarFunctionDynamicDe
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -81,7 +83,8 @@ public class APointConstructorDescriptor extends AbstractScalarFunctionDynamicDe
                             eval.evaluate(tuple);
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == SER_STRING_TYPE_TAG) {
-                                String s = new String(serString, 3, outInput.getLength() - 3, "UTF-8");
+                                utf8Ptr.set(serString, 1, outInput.getLength()-1);
+                                String s = utf8Ptr.toString();
                                 aPoint.setValue(Double.parseDouble(s.substring(0, s.indexOf(','))),
                                         Double.parseDouble(s.substring(s.indexOf(',') + 1, s.length())));
                                 pointSerde.serialize(aPoint, out);

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
index 1eb1e9d..4fb24a5 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/APolygonConstructorDescriptor.java
@@ -36,6 +36,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -68,6 +69,7 @@ public class APolygonConstructorDescriptor extends AbstractScalarFunctionDynamic
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -77,7 +79,8 @@ public class APolygonConstructorDescriptor extends AbstractScalarFunctionDynamic
                             eval.evaluate(tuple);
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == SER_STRING_TYPE_TAG) {
-                                String s = new String(serString, 3, outInput.getLength() - 3, "UTF-8");
+                                utf8Ptr.set(serString, 1, outInput.getLength()-1);
+                                String s = utf8Ptr.toString();
                                 String[] points = s.split(" ");
                                 if (points.length <= 2)
                                     throw new AlgebricksException(errorMessage);

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
index 98aaff5..cefa031 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ARectangleConstructorDescriptor.java
@@ -38,6 +38,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -74,6 +75,7 @@ public class ARectangleConstructorDescriptor extends AbstractScalarFunctionDynam
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -83,7 +85,8 @@ public class ARectangleConstructorDescriptor extends AbstractScalarFunctionDynam
                             eval.evaluate(tuple);
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == SER_STRING_TYPE_TAG) {
-                                String s = new String(serString, 3, outInput.getLength() - 3, "UTF-8");
+                                utf8Ptr.set(serString, 1, outInput.getLength() -1);
+                                String s = utf8Ptr.toString();
                                 int commaIndex = s.indexOf(',');
                                 int spaceIndex = s.indexOf(' ', commaIndex + 1);
                                 aPoint[0].setValue(Double.parseDouble(s.substring(0, commaIndex)),

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
index 290bbda..daa8ac0 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
@@ -20,8 +20,6 @@ package org.apache.asterix.runtime.evaluators.constructors;
 
 import java.io.DataOutput;
 import java.io.IOException;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
 
 import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
 import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
@@ -45,7 +43,8 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.data.std.util.ByteArrayAccessibleOutputStream;
+import org.apache.hyracks.data.std.util.GrowableArray;
+import org.apache.hyracks.data.std.util.UTF8StringBuilder;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 public class AStringConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -64,110 +63,101 @@ public class AStringConstructorDescriptor extends AbstractScalarFunctionDynamicD
 
             @Override
             public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
-                try {
-                    return new ICopyEvaluator() {
+                return new ICopyEvaluator() {
 
-                        private DataOutput out = output.getDataOutput();
-                        private ArrayBackedValueStorage outInput = new ArrayBackedValueStorage();
-                        private ByteArrayAccessibleOutputStream baaos = new ByteArrayAccessibleOutputStream();
-                        private PrintStream ps = new PrintStream(baaos, false, "UTF-8");
-                        private ICopyEvaluator eval = args[0].createEvaluator(outInput);
-                        @SuppressWarnings("unchecked")
-                        private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
-                                .getSerializerDeserializer(BuiltinType.ANULL);
+                    private DataOutput out = output.getDataOutput();
+                    private ArrayBackedValueStorage outInput = new ArrayBackedValueStorage();
+                    private ICopyEvaluator eval = args[0].createEvaluator(outInput);
+                    @SuppressWarnings("unchecked")
+                    private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+                            .getSerializerDeserializer(BuiltinType.ANULL);
+                    private UTF8StringBuilder builder = new UTF8StringBuilder();
+                    private GrowableArray baaos = new GrowableArray();
 
-                        @Override
-                        public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
-                            try {
-                                outInput.reset();
-                                baaos.reset();
-                                eval.evaluate(tuple);
-                                byte[] serString = outInput.getByteArray();
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
+                        try {
+                            outInput.reset();
+                            baaos.reset();
+                            eval.evaluate(tuple);
+                            byte[] serString = outInput.getByteArray();
 
-                                ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[serString[0]];
-                                if (tt == ATypeTag.NULL) {
-                                    nullSerde.serialize(ANull.NULL, out);
-                                } else if (tt == ATypeTag.STRING) {
-                                    out.write(outInput.getByteArray(), outInput.getStartOffset(), outInput.getLength());
-                                } else {
-                                    baaos.write(0);
-                                    baaos.write(0);
-                                    switch (tt) {
-                                        case INT8: {
-                                            int i = AInt8SerializerDeserializer.getByte(outInput.getByteArray(), 1);
-                                            ps.print(i);
-                                            break;
-                                        }
-                                        case INT16: {
-                                            int i = AInt16SerializerDeserializer.getShort(outInput.getByteArray(), 1);
-                                            ps.print(i);
-                                            break;
-                                        }
-                                        case INT32: {
-                                            int i = AInt32SerializerDeserializer.getInt(outInput.getByteArray(), 1);
-                                            ps.print(i);
-                                            break;
-                                        }
-                                        case INT64: {
-                                            long l = AInt64SerializerDeserializer.getLong(outInput.getByteArray(), 1);
-                                            ps.print(l);
-                                            break;
-                                        }
-                                        case DOUBLE: {
-                                            double d = ADoubleSerializerDeserializer.getDouble(outInput.getByteArray(),
-                                                    1);
-                                            ps.print(d);
-                                            break;
-                                        }
-                                        case FLOAT: {
-                                            float f = AFloatSerializerDeserializer.getFloat(outInput.getByteArray(), 1);
-                                            ps.print(f);
-                                            break;
-                                        }
-                                        case BOOLEAN: {
-                                            boolean b = ABooleanSerializerDeserializer.getBoolean(
-                                                    outInput.getByteArray(), 1);
-                                            ps.print(b);
-                                            break;
-                                        }
-
-                                        // NotYetImplemented
-                                        case CIRCLE:
-                                        case DATE:
-                                        case DATETIME:
-                                        case LINE:
-                                        case TIME:
-                                        case DURATION:
-                                        case YEARMONTHDURATION:
-                                        case DAYTIMEDURATION:
-                                        case INTERVAL:
-                                        case ORDEREDLIST:
-                                        case POINT:
-                                        case POINT3D:
-                                        case RECTANGLE:
-                                        case POLYGON:
-                                        case RECORD:
-                                        case UNORDEREDLIST:
-                                        case UUID:
-                                        default:
-                                            throw new AlgebricksException("string of " + tt + " not supported");
+                            ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[serString[0]];
+                            if (tt == ATypeTag.NULL) {
+                                nullSerde.serialize(ANull.NULL, out);
+                            } else if (tt == ATypeTag.STRING) {
+                                out.write(outInput.getByteArray(), outInput.getStartOffset(), outInput.getLength());
+                            } else {
+                                builder.reset(baaos, outInput.getLength());
+                                switch (tt) {
+                                    case INT8: {
+                                        int i = AInt8SerializerDeserializer.getByte(outInput.getByteArray(), 1);
+                                        builder.appendString(String.valueOf(i));
+                                        break;
+                                    }
+                                    case INT16: {
+                                        int i = AInt16SerializerDeserializer.getShort(outInput.getByteArray(), 1);
+                                        builder.appendString(String.valueOf(i));
+                                        break;
+                                    }
+                                    case INT32: {
+                                        int i = AInt32SerializerDeserializer.getInt(outInput.getByteArray(), 1);
+                                        builder.appendString(String.valueOf(i));
+                                        break;
+                                    }
+                                    case INT64: {
+                                        long l = AInt64SerializerDeserializer.getLong(outInput.getByteArray(), 1);
+                                        builder.appendString(String.valueOf(l));
+                                        break;
                                     }
-                                    ps.flush();
-                                    byte[] tmpStrBytes = baaos.getByteArray();
-                                    int utfLen = baaos.size() - 2;
-                                    tmpStrBytes[0] = (byte) ((utfLen >>> 8) & 0xFF);
-                                    tmpStrBytes[1] = (byte) ((utfLen >>> 0) & 0xFF);
-                                    out.write(ATypeTag.STRING.serialize());
-                                    out.write(tmpStrBytes);
+                                    case DOUBLE: {
+                                        double d = ADoubleSerializerDeserializer.getDouble(outInput.getByteArray(),
+                                                1);
+                                        builder.appendString(String.valueOf(d));
+                                        break;
+                                    }
+                                    case FLOAT: {
+                                        float f = AFloatSerializerDeserializer.getFloat(outInput.getByteArray(), 1);
+                                        builder.appendString(String.valueOf(f));
+                                        break;
+                                    }
+                                    case BOOLEAN: {
+                                        boolean b = ABooleanSerializerDeserializer.getBoolean(
+                                                outInput.getByteArray(), 1);
+                                        builder.appendString(String.valueOf(b));
+                                        break;
+                                    }
+
+                                    // NotYetImplemented
+                                    case CIRCLE:
+                                    case DATE:
+                                    case DATETIME:
+                                    case LINE:
+                                    case TIME:
+                                    case DURATION:
+                                    case YEARMONTHDURATION:
+                                    case DAYTIMEDURATION:
+                                    case INTERVAL:
+                                    case ORDEREDLIST:
+                                    case POINT:
+                                    case POINT3D:
+                                    case RECTANGLE:
+                                    case POLYGON:
+                                    case RECORD:
+                                    case UNORDEREDLIST:
+                                    case UUID:
+                                    default:
+                                        throw new AlgebricksException("string of " + tt + " not supported");
                                 }
-                            } catch (IOException e) {
-                                throw new AlgebricksException(e);
+                                builder.finish();
+                                out.write(ATypeTag.STRING.serialize());
+                                out.write(baaos.getByteArray(), 0, baaos.getLength());
                             }
+                        } catch (IOException e) {
+                            throw new AlgebricksException(e);
                         }
-                    };
-                } catch (UnsupportedEncodingException e) {
-                    throw new AlgebricksException(e);
-                }
+                    }
+                };
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
index fa287ce..db8f854 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
@@ -39,6 +39,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -75,6 +76,7 @@ public class ATimeConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -85,7 +87,9 @@ public class ATimeConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == SER_STRING_TYPE_TAG) {
 
-                                int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);
+                                utf8Ptr.set(serString, 1, outInput.getLength()-1);
+                                int stringLength = utf8Ptr.getUTF8Length();
+                                int startOffset = utf8Ptr.getCharStartOffset();
 
                                 // the string to be parsed should be at least 6 characters: hhmmss
                                 if (stringLength < 6) {
@@ -94,7 +98,7 @@ public class ATimeConstructorDescriptor extends AbstractScalarFunctionDynamicDes
                                             + stringLength);
                                 }
 
-                                int chrononTimeInMs = ATimeParserFactory.parseTimePart(serString, 3, stringLength);
+                                int chrononTimeInMs = ATimeParserFactory.parseTimePart(serString, startOffset, stringLength);
 
                                 if (chrononTimeInMs < 0) {
                                     chrononTimeInMs += GregorianCalendarSystem.CHRONON_OF_DAY;

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
index 16e913e..6edd393 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
@@ -37,6 +37,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -81,6 +82,8 @@ public class AUUIDFromStringConstructorDescriptor extends AbstractScalarFunction
                     private long lsb = 0;
                     private long tmpLongValue = 0;
 
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
+
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
                         try {
@@ -88,14 +91,14 @@ public class AUUIDFromStringConstructorDescriptor extends AbstractScalarFunction
                             eval.evaluate(tuple);
                             byte[] serString = outInput.getByteArray();
                             if (serString[0] == SER_STRING_TYPE_TAG) {
+                                utf8Ptr.set(serString, 1, outInput.getLength()-1);
                                 msb = 0;
                                 lsb = 0;
                                 tmpLongValue = 0;
 
-                                // first byte: tag, next two bytes: length, so
-                                // we add 3 bytes.
+                                // first byte: tag, next x bytes: length
+                                int offset = utf8Ptr.getCharStartOffset();
                                 // First part - 8 bytes
-                                int offset = 3;
                                 msb = calculateLongFromHex(serString, offset, 8);
                                 msb <<= 16;
                                 offset += 8;

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
index 1265d19..3b9c006 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
@@ -38,6 +38,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -76,6 +77,7 @@ public class AYearMonthDurationConstructorDescriptor extends AbstractScalarFunct
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
                             .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -85,11 +87,12 @@ public class AYearMonthDurationConstructorDescriptor extends AbstractScalarFunct
                             byte[] serString = outInput.getByteArray();
 
                             if (serString[0] == SER_STRING_TYPE_TAG) {
+                                utf8Ptr.set(serString, 1, outInput.getLength() - 1);
+                                int stringLength = utf8Ptr.getUTF8Length();
 
-                                int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);
-
-                                ADurationParserFactory.parseDuration(serString, 3, stringLength, aYearMonthDuration,
-                                        ADurationParseOption.YEAR_MONTH);
+                                ADurationParserFactory
+                                        .parseDuration(serString, utf8Ptr.getCharStartOffset(), stringLength,
+                                                aYearMonthDuration, ADurationParseOption.YEAR_MONTH);
 
                                 yearMonthDurationSerde.serialize(aYearMonthDuration, out);
                             } else if (serString[0] == SER_NULL_TYPE_TAG) {

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
index c8ee3eb..c40cb95 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 
 import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
 import org.apache.asterix.om.base.ABoolean;
+import org.apache.asterix.om.base.ANull;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
@@ -33,6 +34,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -49,9 +51,16 @@ public abstract class AbstractBinaryStringBoolEval implements ICopyEvaluator {
     private ICopyEvaluator evalLeft;
     private ICopyEvaluator evalRight;
     private final FunctionIdentifier funcID;
+
+    private final UTF8StringPointable leftPtr = new UTF8StringPointable();
+    private final UTF8StringPointable rightPtr = new UTF8StringPointable();
+
     @SuppressWarnings({ "rawtypes" })
     private ISerializerDeserializer boolSerde = AqlSerializerDeserializerProvider.INSTANCE
             .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    @SuppressWarnings("unchecked")
+    private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+            .getSerializerDeserializer(BuiltinType.ANULL);
 
     public AbstractBinaryStringBoolEval(DataOutput dout, ICopyEvaluatorFactory evalLeftFactory,
             ICopyEvaluatorFactory evalRightFactory, FunctionIdentifier funcID) throws AlgebricksException {
@@ -70,12 +79,8 @@ public abstract class AbstractBinaryStringBoolEval implements ICopyEvaluator {
         evalRight.evaluate(tuple);
 
         try {
-            if (array0.getByteArray()[0] == SER_NULL_TYPE_TAG && array1.getByteArray()[0] == SER_NULL_TYPE_TAG) {
-                boolSerde.serialize(ABoolean.TRUE, dout);
-                return;
-            } else if ((array0.getByteArray()[0] == SER_NULL_TYPE_TAG && array1.getByteArray()[0] == SER_STRING_TYPE_TAG)
-                    || (array0.getByteArray()[0] == SER_STRING_TYPE_TAG && array1.getByteArray()[0] == SER_NULL_TYPE_TAG)) {
-                boolSerde.serialize(ABoolean.FALSE, dout);
+            if (array0.getByteArray()[0] == SER_NULL_TYPE_TAG || array1.getByteArray()[0] == SER_NULL_TYPE_TAG) {
+                nullSerde.serialize(ANull.NULL, dout);
                 return;
             } else if (array0.getByteArray()[0] != SER_STRING_TYPE_TAG
                     || array1.getByteArray()[0] != SER_STRING_TYPE_TAG) {
@@ -87,15 +92,10 @@ public abstract class AbstractBinaryStringBoolEval implements ICopyEvaluator {
             throw new AlgebricksException(e);
         }
 
-        byte[] b1 = array0.getByteArray();
-        byte[] b2 = array1.getByteArray();
-
-        int lLen = array0.getLength();
-        int rLen = array1.getLength();
+        leftPtr.set(array0.getByteArray(), array0.getStartOffset() + 1, array0.getLength());
+        rightPtr.set(array1.getByteArray(), array1.getStartOffset() + 1, array1.getLength());
 
-        int lStart = array0.getStartOffset();
-        int rStart = array1.getStartOffset();
-        ABoolean res = compute(b1, lLen, lStart, b2, rLen, rStart, array0, array1) ? ABoolean.TRUE : ABoolean.FALSE;
+        ABoolean res = compute(leftPtr, rightPtr) ? ABoolean.TRUE : ABoolean.FALSE;
         try {
             boolSerde.serialize(res, dout);
         } catch (HyracksDataException e) {
@@ -103,34 +103,6 @@ public abstract class AbstractBinaryStringBoolEval implements ICopyEvaluator {
         }
     }
 
-    protected abstract boolean compute(byte[] lBytes, int lLen, int lStart, byte[] rBytes, int rLen, int rStart,
-            ArrayBackedValueStorage array0, ArrayBackedValueStorage array1) throws AlgebricksException;
+    protected abstract boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws AlgebricksException;
 
-    protected String toRegex(AString pattern) {
-        StringBuilder sb = new StringBuilder();
-        String str = pattern.getStringValue();
-        for (int i = 0; i < str.length(); i++) {
-            char c = str.charAt(i);
-            if (c == '\\' && (i < str.length() - 1) && (str.charAt(i + 1) == '_' || str.charAt(i + 1) == '%')) {
-                sb.append(str.charAt(i + 1));
-                ++i;
-            } else if (c == '%') {
-                sb.append(".*");
-            } else if (c == '_') {
-                sb.append(".");
-            } else {
-                if (Arrays.binarySearch(reservedRegexChars, c) >= 0) {
-                    sb.append('\\');
-                }
-                sb.append(c);
-            }
-        }
-        return sb.toString();
-    }
-
-    private final static char[] reservedRegexChars = new char[] { '\\', '(', ')', '[', ']', '{', '}', '.', '^', '$',
-            '*', '|' };
-    static {
-        Arrays.sort(reservedRegexChars);
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
index 335182d..7dbc99a 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
@@ -23,12 +23,10 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import java.io.DataOutput;
-import java.util.Arrays;
 
 import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
 import org.apache.asterix.om.base.AMutableString;
 import org.apache.asterix.om.base.ANull;
-import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
@@ -38,6 +36,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -65,6 +64,11 @@ public abstract class AbstractQuadStringStringEval implements ICopyEvaluator {
     private ISerializerDeserializer strSerde = AqlSerializerDeserializerProvider.INSTANCE
             .getSerializerDeserializer(BuiltinType.ASTRING);
 
+    private final UTF8StringPointable strPtr1st = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr2nd = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr3rd = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr4th = new UTF8StringPointable();
+
     public AbstractQuadStringStringEval(DataOutput dout, ICopyEvaluatorFactory eval0, ICopyEvaluatorFactory eval1,
             ICopyEvaluatorFactory eval2, ICopyEvaluatorFactory eval3, FunctionIdentifier funcID)
             throws AlgebricksException {
@@ -108,22 +112,12 @@ public abstract class AbstractQuadStringStringEval implements ICopyEvaluator {
             throw new AlgebricksException(e);
         }
 
-        byte[] b0 = array0.getByteArray();
-        byte[] b1 = array1.getByteArray();
-        byte[] b2 = array2.getByteArray();
-        byte[] b3 = array3.getByteArray();
-
-        int len0 = array0.getLength();
-        int len1 = array1.getLength();
-        int len2 = array2.getLength();
-        int len3 = array3.getLength();
+        strPtr1st.set(array0.getByteArray(), array0.getStartOffset() + 1, array0.getLength());
+        strPtr2nd.set(array1.getByteArray(), array1.getStartOffset() + 1, array1.getLength());
+        strPtr3rd.set(array2.getByteArray(), array2.getStartOffset() + 1, array2.getLength());
+        strPtr4th.set(array3.getByteArray(), array3.getStartOffset() + 1, array3.getLength());
 
-        int s0 = array0.getStartOffset();
-        int s1 = array1.getStartOffset();
-        int s2 = array2.getStartOffset();
-        int s3 = array3.getStartOffset();
-
-        String res = compute(b0, len0, s0, b1, len1, s1, b2, len2, s2, b3, len3, s3, array0, array1);
+        String res = compute(strPtr1st, strPtr2nd, strPtr3rd, strPtr4th);
         resultBuffer.setValue(res);
         try {
             strSerde.serialize(resultBuffer, dout);
@@ -132,30 +126,8 @@ public abstract class AbstractQuadStringStringEval implements ICopyEvaluator {
         }
     }
 
-    protected abstract String compute(byte[] b0, int l0, int s0, byte[] b1, int l1, int s1, byte[] b2, int l2, int s2,
-            byte[] b3, int l3, int s3, ArrayBackedValueStorage array0, ArrayBackedValueStorage array1)
-            throws AlgebricksException;
-
-    protected String toRegex(AString pattern) {
-        StringBuilder sb = new StringBuilder();
-        String str = pattern.getStringValue();
-        for (int i = 0; i < str.length(); i++) {
-            char c = str.charAt(i);
-            if (c == '\\' && (i < str.length() - 1) && (str.charAt(i + 1) == '_' || str.charAt(i + 1) == '%')) {
-                sb.append(str.charAt(i + 1));
-                ++i;
-            } else if (c == '%') {
-                sb.append(".*");
-            } else if (c == '_') {
-                sb.append(".");
-            } else {
-                if (Arrays.binarySearch(StringEvaluatorUtils.reservedRegexChars, c) >= 0) {
-                    sb.append('\\');
-                }
-                sb.append(c);
-            }
-        }
-        return sb.toString();
-    }
+    protected abstract String compute(UTF8StringPointable strPtr1st, UTF8StringPointable strPtr2nd,
+            UTF8StringPointable strPtr3rd,
+            UTF8StringPointable strPtr4th) throws AlgebricksException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringContainsEval.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringContainsEval.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringContainsEval.java
deleted file mode 100644
index e946edf..0000000
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringContainsEval.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.evaluators.functions;
-
-import java.io.DataOutput;
-
-import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
-import org.apache.asterix.om.base.ABoolean;
-import org.apache.asterix.om.base.ANull;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.EnumDeserializer;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
-import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
-
-public abstract class AbstractStringContainsEval implements ICopyEvaluator {
-
-    private DataOutput dout;
-
-    // allowed input types
-    private final static byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
-    private final static byte SER_STRING_TYPE_TAG = ATypeTag.STRING.serialize();
-
-    private ArrayBackedValueStorage array0 = new ArrayBackedValueStorage();
-    private ArrayBackedValueStorage array1 = new ArrayBackedValueStorage();
-    private ICopyEvaluator evalString;
-    private ICopyEvaluator evalPattern;
-    @SuppressWarnings("rawtypes")
-    private ISerializerDeserializer boolSerde = AqlSerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
-    @SuppressWarnings("unchecked")
-    private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
-
-    private final FunctionIdentifier funcID;
-
-    public AbstractStringContainsEval(DataOutput dout, ICopyEvaluatorFactory evalStringFactory,
-            ICopyEvaluatorFactory evalPatternFactory, FunctionIdentifier funcID) throws AlgebricksException {
-        this.dout = dout;
-        this.evalString = evalStringFactory.createEvaluator(array0);
-        this.evalPattern = evalPatternFactory.createEvaluator(array1);
-        this.funcID = funcID;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
-        array1.reset();
-        evalPattern.evaluate(tuple);
-        array0.reset();
-        evalString.evaluate(tuple);
-
-        try {
-            if (array0.getByteArray()[0] == SER_NULL_TYPE_TAG || array1.getByteArray()[0] == SER_NULL_TYPE_TAG) {
-                nullSerde.serialize(ANull.NULL, dout);
-                return;
-            }
-
-            if (array0.getByteArray()[0] != SER_STRING_TYPE_TAG || array1.getByteArray()[0] != SER_STRING_TYPE_TAG) {
-                throw new AlgebricksException(funcID.getName()
-                        + ": expects input type (STRING/NULL, STRING/NULL), but got ("
-                        + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(array0.getByteArray()[0]) + ", "
-                        + EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(array1.getByteArray()[0]) + ").");
-            }
-        } catch (HyracksDataException e) {
-            throw new AlgebricksException(e);
-        }
-
-        byte[] b1 = array0.getByteArray();
-        byte[] b2 = array1.getByteArray();
-        ABoolean res = findMatch(b1, b2) ? ABoolean.TRUE : ABoolean.FALSE;
-        try {
-            boolSerde.serialize(res, dout);
-        } catch (HyracksDataException e) {
-            throw new AlgebricksException(e);
-        }
-    }
-
-    protected abstract boolean findMatch(byte[] strBytes, byte[] patternBytes);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
index 2740e4b..f966c1c 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
@@ -19,11 +19,10 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import java.io.DataOutput;
-import java.util.Arrays;
 
 import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
 import org.apache.asterix.om.base.ABoolean;
-import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.base.ANull;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
@@ -33,6 +32,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -50,9 +50,16 @@ public abstract class AbstractTripleStringBoolEval implements ICopyEvaluator {
     @SuppressWarnings("rawtypes")
     private ISerializerDeserializer boolSerde = AqlSerializerDeserializerProvider.INSTANCE
             .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    @SuppressWarnings("unchecked")
+    private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+            .getSerializerDeserializer(BuiltinType.ANULL);
 
     private final FunctionIdentifier funcID;
 
+    private final UTF8StringPointable strPtr1st = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr2nd = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr3rd = new UTF8StringPointable();
+
     public AbstractTripleStringBoolEval(DataOutput dout, ICopyEvaluatorFactory eval0, ICopyEvaluatorFactory eval1,
             ICopyEvaluatorFactory eval2, FunctionIdentifier funcID) throws AlgebricksException {
         this.dout = dout;
@@ -73,12 +80,9 @@ public abstract class AbstractTripleStringBoolEval implements ICopyEvaluator {
         eval2.evaluate(tuple);
 
         try {
-            if ((array0.getByteArray()[0] == SER_NULL_TYPE_TAG && array1.getByteArray()[0] == SER_STRING_TYPE_TAG)
-                    || (array1.getByteArray()[0] == SER_NULL_TYPE_TAG && array0.getByteArray()[0] == SER_STRING_TYPE_TAG)) {
-                boolSerde.serialize(ABoolean.FALSE, dout);
-                return;
-            } else if (array0.getByteArray()[0] == SER_NULL_TYPE_TAG && array1.getByteArray()[0] == SER_NULL_TYPE_TAG) {
-                boolSerde.serialize(ABoolean.TRUE, dout);
+            if (array0.getByteArray()[0] == SER_NULL_TYPE_TAG || array1.getByteArray()[0] == SER_NULL_TYPE_TAG
+                    || array2.getByteArray()[0] == SER_NULL_TYPE_TAG) {
+                nullSerde.serialize(ANull.NULL, dout);
                 return;
             }
 
@@ -95,19 +99,11 @@ public abstract class AbstractTripleStringBoolEval implements ICopyEvaluator {
             throw new AlgebricksException(e);
         }
 
-        byte[] b0 = array0.getByteArray();
-        byte[] b1 = array1.getByteArray();
-        byte[] b2 = array2.getByteArray();
-
-        int len0 = array0.getLength();
-        int len1 = array1.getLength();
-        int len2 = array2.getLength();
+        strPtr1st.set(array0.getByteArray(), array0.getStartOffset() + 1, array0.getLength());
+        strPtr2nd.set(array1.getByteArray(), array1.getStartOffset() + 1, array1.getLength());
+        strPtr3rd.set(array2.getByteArray(), array2.getStartOffset() + 1, array2.getLength());
 
-        int s0 = array0.getStartOffset();
-        int s1 = array1.getStartOffset();
-        int s2 = array2.getStartOffset();
-
-        ABoolean res = compute(b0, len0, s0, b1, len1, s1, b2, len2, s2, array0, array1) ? ABoolean.TRUE
+        ABoolean res = compute(strPtr1st, strPtr2nd, strPtr3rd) ? ABoolean.TRUE
                 : ABoolean.FALSE;
         try {
             boolSerde.serialize(res, dout);
@@ -116,28 +112,7 @@ public abstract class AbstractTripleStringBoolEval implements ICopyEvaluator {
         }
     }
 
-    protected abstract boolean compute(byte[] b0, int l0, int s0, byte[] b1, int l1, int s1, byte[] b2, int l2, int s2,
-            ArrayBackedValueStorage array0, ArrayBackedValueStorage array1) throws AlgebricksException;
+    protected abstract boolean compute(UTF8StringPointable strPtr1st, UTF8StringPointable strPtr2nd,
+            UTF8StringPointable strPtr3rd) throws AlgebricksException;
 
-    protected String toRegex(AString pattern) {
-        StringBuilder sb = new StringBuilder();
-        String str = pattern.getStringValue();
-        for (int i = 0; i < str.length(); i++) {
-            char c = str.charAt(i);
-            if (c == '\\' && (i < str.length() - 1) && (str.charAt(i + 1) == '_' || str.charAt(i + 1) == '%')) {
-                sb.append(str.charAt(i + 1));
-                ++i;
-            } else if (c == '%') {
-                sb.append(".*");
-            } else if (c == '_') {
-                sb.append(".");
-            } else {
-                if (Arrays.binarySearch(StringEvaluatorUtils.reservedRegexChars, c) >= 0) {
-                    sb.append('\\');
-                }
-                sb.append(c);
-            }
-        }
-        return sb.toString();
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
index ebedb56..9e79832 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
@@ -19,13 +19,10 @@
 package org.apache.asterix.runtime.evaluators.functions;
 
 import java.io.DataOutput;
-import java.util.Arrays;
-import java.util.regex.Pattern;
 
 import org.apache.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
 import org.apache.asterix.om.base.AMutableString;
 import org.apache.asterix.om.base.ANull;
-import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
@@ -35,6 +32,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
@@ -58,6 +56,10 @@ public abstract class AbstractTripleStringStringEval implements ICopyEvaluator {
     private ISerializerDeserializer strSerde = AqlSerializerDeserializerProvider.INSTANCE
             .getSerializerDeserializer(BuiltinType.ASTRING);
 
+    private final UTF8StringPointable strPtr1st = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr2nd = new UTF8StringPointable();
+    private final UTF8StringPointable strPtr3rd = new UTF8StringPointable();
+
     private final FunctionIdentifier funcID;
 
     public AbstractTripleStringStringEval(DataOutput dout, ICopyEvaluatorFactory eval0, ICopyEvaluatorFactory eval1,
@@ -97,19 +99,11 @@ public abstract class AbstractTripleStringStringEval implements ICopyEvaluator {
             throw new AlgebricksException(e);
         }
 
-        byte[] b0 = array0.getByteArray();
-        byte[] b1 = array1.getByteArray();
-        byte[] b2 = array2.getByteArray();
-
-        int len0 = array0.getLength();
-        int len1 = array1.getLength();
-        int len2 = array2.getLength();
+        strPtr1st.set(array0.getByteArray(), array0.getStartOffset() + 1, array0.getLength());
+        strPtr2nd.set(array1.getByteArray(), array1.getStartOffset() + 1, array1.getLength());
+        strPtr3rd.set(array2.getByteArray(), array2.getStartOffset() + 1, array2.getLength());
 
-        int s0 = array0.getStartOffset();
-        int s1 = array1.getStartOffset();
-        int s2 = array2.getStartOffset();
-
-        String res = compute(b0, len0, s0, b1, len1, s1, b2, len2, s2, array0, array1);
+        String res = compute(strPtr1st, strPtr2nd, strPtr3rd);
         resultBuffer.setValue(res);
         try {
             strSerde.serialize(resultBuffer, dout);
@@ -118,58 +112,6 @@ public abstract class AbstractTripleStringStringEval implements ICopyEvaluator {
         }
     }
 
-    protected abstract String compute(byte[] b0, int l0, int s0, byte[] b1, int l1, int s1, byte[] b2, int l2, int s2,
-            ArrayBackedValueStorage array0, ArrayBackedValueStorage array1) throws AlgebricksException;
-
-    protected String toRegex(AString pattern) {
-        StringBuilder sb = new StringBuilder();
-        String str = pattern.getStringValue();
-        for (int i = 0; i < str.length(); i++) {
-            char c = str.charAt(i);
-            if (c == '\\' && (i < str.length() - 1) && (str.charAt(i + 1) == '_' || str.charAt(i + 1) == '%')) {
-                sb.append(str.charAt(i + 1));
-                ++i;
-            } else if (c == '%') {
-                sb.append(".*");
-            } else if (c == '_') {
-                sb.append(".");
-            } else {
-                if (Arrays.binarySearch(reservedRegexChars, c) >= 0) {
-                    sb.append('\\');
-                }
-                sb.append(c);
-            }
-        }
-        return sb.toString();
-    }
-
-    protected int toFlag(AString pattern) {
-        String str = pattern.getStringValue();
-        int flag = 0;
-        for (int i = 0; i < str.length(); i++) {
-            char c = str.charAt(i);
-            switch (c) {
-                case 's':
-                    flag |= Pattern.DOTALL;
-                    break;
-                case 'm':
-                    flag |= Pattern.MULTILINE;
-                    break;
-                case 'i':
-                    flag |= Pattern.CASE_INSENSITIVE;
-                    break;
-                case 'x':
-                    flag |= Pattern.COMMENTS;
-                    break;
-            }
-        }
-        return flag;
-    }
-
-    private final static char[] reservedRegexChars = new char[] { '\\', '(', ')', '[', ']', '{', '}', '.', '^', '$',
-            '*', '|' };
-
-    static {
-        Arrays.sort(reservedRegexChars);
-    }
+    protected abstract String compute(UTF8StringPointable strPtr1st, UTF8StringPointable strPtr2nd,
+            UTF8StringPointable strPtr3rd) throws AlgebricksException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
index d7b7d0a..42c5c49 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodePointToStringDescriptor.java
@@ -37,7 +37,7 @@ import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
 import org.apache.hyracks.data.std.api.IDataOutputProvider;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
-import org.apache.hyracks.dataflow.common.data.util.StringUtils;
+import org.apache.hyracks.util.string.UTF8StringUtil;
 
 public class CodePointToStringDescriptor extends AbstractScalarFunctionDynamicDescriptor {
 
@@ -49,6 +49,7 @@ public class CodePointToStringDescriptor extends AbstractScalarFunctionDynamicDe
     };
 
     private final static byte[] currentUTF8 = new byte[6];
+    private final static byte[] tempStoreForLength = new byte[5];
     private final byte stringTypeTag = ATypeTag.STRING.serialize();
 
     @Override
@@ -57,44 +58,6 @@ public class CodePointToStringDescriptor extends AbstractScalarFunctionDynamicDe
 
             private static final long serialVersionUID = 1L;
 
-            private int codePointToUTF8(int c) {
-                if (c < 0x80) {
-                    currentUTF8[0] = (byte) (c & 0x7F /* mask 7 lsb: 0b1111111 */);
-                    return 1;
-                } else if (c < 0x0800) {
-                    currentUTF8[0] = (byte) (c >> 6 & 0x1F | 0xC0);
-                    currentUTF8[1] = (byte) (c & 0x3F | 0x80);
-                    return 2;
-                } else if (c < 0x010000) {
-                    currentUTF8[0] = (byte) (c >> 12 & 0x0F | 0xE0);
-                    currentUTF8[1] = (byte) (c >> 6 & 0x3F | 0x80);
-                    currentUTF8[2] = (byte) (c & 0x3F | 0x80);
-                    return 3;
-                } else if (c < 0x200000) {
-                    currentUTF8[0] = (byte) (c >> 18 & 0x07 | 0xF0);
-                    currentUTF8[1] = (byte) (c >> 12 & 0x3F | 0x80);
-                    currentUTF8[2] = (byte) (c >> 6 & 0x3F | 0x80);
-                    currentUTF8[3] = (byte) (c & 0x3F | 0x80);
-                    return 4;
-                } else if (c < 0x4000000) {
-                    currentUTF8[0] = (byte) (c >> 24 & 0x03 | 0xF8);
-                    currentUTF8[1] = (byte) (c >> 18 & 0x3F | 0x80);
-                    currentUTF8[2] = (byte) (c >> 12 & 0x3F | 0x80);
-                    currentUTF8[3] = (byte) (c >> 6 & 0x3F | 0x80);
-                    currentUTF8[4] = (byte) (c & 0x3F | 0x80);
-                    return 5;
-                } else if (c < 0x80000000) {
-                    currentUTF8[0] = (byte) (c >> 30 & 0x01 | 0xFC);
-                    currentUTF8[1] = (byte) (c >> 24 & 0x3F | 0x80);
-                    currentUTF8[2] = (byte) (c >> 18 & 0x3F | 0x80);
-                    currentUTF8[3] = (byte) (c >> 12 & 0x3F | 0x80);
-                    currentUTF8[4] = (byte) (c >> 6 & 0x3F | 0x80);
-                    currentUTF8[5] = (byte) (c & 0x3F | 0x80);
-                    return 6;
-                }
-                return 0;
-            }
-
             @Override
             public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
                 return new ICopyEvaluator() {
@@ -139,17 +102,17 @@ public class CodePointToStringDescriptor extends AbstractScalarFunctionDynamicDe
                                     int codePoint = 0;
                                     codePoint = ATypeHierarchy.getIntegerValueWithDifferentTypeTagPosition(
                                             serOrderedList, itemOffset, 1);
-                                    utf_8_len += codePointToUTF8(codePoint);
+                                    utf_8_len += UTF8StringUtil.codePointToUTF8(codePoint, currentUTF8);
                                 }
                                 out.writeByte(stringTypeTag);
-                                StringUtils.writeUTF8Len(utf_8_len, out);
+                                UTF8StringUtil.writeUTF8Length(utf_8_len, tempStoreForLength, out);
                                 for (int i = 0; i < size; i++) {
                                     int itemOffset = AOrderedListSerializerDeserializer
                                             .getItemOffset(serOrderedList, i);
                                     int codePoint = 0;
                                     codePoint = ATypeHierarchy.getIntegerValueWithDifferentTypeTagPosition(
                                             serOrderedList, itemOffset, 1);
-                                    utf_8_len = codePointToUTF8(codePoint);
+                                    utf_8_len = UTF8StringUtil.codePointToUTF8(codePoint, currentUTF8);
                                     for (int j = 0; j < utf_8_len; j++) {
                                         out.writeByte(currentUTF8[j]);
                                     }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodepointIterator.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodepointIterator.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodepointIterator.java
deleted file mode 100644
index bc91000..0000000
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CodepointIterator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.evaluators.functions;
-
-import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-
-public class CodepointIterator {
-    public void reset(byte[] buf, int startPos) {
-        this.buf = buf;
-        this.curPos = startPos + 2;
-        this.startPos = startPos;
-        len = UTF8StringPointable.getUTFLength(buf, startPos);
-    }
-
-    public int size() {
-        return len;
-    }
-
-    private byte[] buf;
-    private int curPos = 0;
-    private int len = 0;
-    private int startPos = 0;
-
-    public int getCodePoint() {
-        return UTF8ToCodePoint(buf, curPos);
-    }
-
-    public static int UTF8ToCodePoint(byte[] b, int s) {
-        if (b[s] >> 7 == 0) {
-            // 1 byte
-            return b[s];
-        } else if ((b[s] & 0xe0) == 0xc0) { /*
-                                            * 0xe0 = 0b1110000
-                                            */
-            // 2 bytes
-            return ((int) (b[s] & 0x1f)) << 6 | /*
-                                                * 0x3f = 0b00111111
-                                                */((int) (b[s + 1] & 0x3f));
-        } else if ((b[s] & 0xf0) == 0xe0) {
-            // 3bytes
-            return ((int) (b[s] & 0xf)) << 12 | ((int) (b[s + 1] & 0x3f)) << 6 | ((int) (b[s + 2] & 0x3f));
-        } else if ((b[s] & 0xf8) == 0xf0) {
-            // 4bytes
-            return ((int) (b[s] & 0x7)) << 18 | ((int) (b[s + 1] & 0x3f)) << 12 | ((int) (b[s + 2] & 0x3f)) << 6
-                    | ((int) (b[s + 3] & 0x3f));
-        } else if ((b[s] & 0xfc) == 0xf8) {
-            // 5bytes
-            return ((int) (b[s] & 0x3)) << 24 | ((int) (b[s + 1] & 0x3f)) << 18 | ((int) (b[s + 2] & 0x3f)) << 12
-                    | ((int) (b[s + 3] & 0x3f)) << 6 | ((int) (b[s + 4] & 0x3f));
-        } else if ((b[s] & 0xfe) == 0xfc) {
-            // 6bytes
-            return ((int) (b[s] & 0x1)) << 30 | ((int) (b[s + 1] & 0x3f)) << 24 | ((int) (b[s + 2] & 0x3f)) << 18
-                    | ((int) (b[s + 3] & 0x3f)) << 12 | ((int) (b[s + 4] & 0x3f)) << 6 | ((int) (b[s + 5] & 0x3f));
-        }
-        return 0;
-    }
-
-    public void next() {
-        int step = UTF8StringPointable.charSize(buf, curPos);
-        if (step + curPos < len + 2 + startPos)
-            curPos += step;
-    }
-
-    public boolean hasNext() {
-        int step = UTF8StringPointable.charSize(buf, curPos);
-        if (step + curPos < len + 2 + startPos)
-            return true;
-        return false;
-    }
-
-    public static int compare(CodepointIterator ls, CodepointIterator rs) {
-        CodepointIterator shortString = ls.size() < rs.size() ? ls : rs;
-
-        while (true) {
-            int c1 = ls.getCodePoint();
-            int c2 = rs.getCodePoint();
-            if (c1 != c2) {
-                return c1 - c2;
-            }
-            if (shortString.hasNext()) {
-                ls.next();
-                rs.next();
-            } else {
-                break;
-            }
-        }
-        return ls.size() - rs.size();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ContainsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ContainsDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ContainsDescriptor.java
deleted file mode 100644
index aeffc97..0000000
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ContainsDescriptor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.evaluators.functions;
-
-import java.io.DataOutput;
-
-import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
-import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
-import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
-import org.apache.hyracks.data.std.api.IDataOutputProvider;
-import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-
-public class ContainsDescriptor extends AbstractScalarFunctionDynamicDescriptor {
-    private static final long serialVersionUID = 1L;
-
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new ContainsDescriptor();
-        }
-    };
-
-    @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 AbstractStringContainsEval(dout, args[0], args[1], AsterixBuiltinFunctions.CONTAINS) {
-
-                    @Override
-                    protected boolean findMatch(byte[] strBytes, byte[] patternBytes) {
-                        int utflen1 = UTF8StringPointable.getUTFLength(strBytes, 1);
-                        int utflen2 = UTF8StringPointable.getUTFLength(patternBytes, 1);
-
-                        int s1Start = 3;
-                        int s2Start = 3;
-
-                        boolean matches = false;
-                        int maxStart = utflen1 - utflen2;
-                        int startMatch = 0;
-                        while (startMatch <= maxStart) {
-                            int c1 = startMatch;
-                            int c2 = 0;
-                            while (c1 < utflen1 && c2 < utflen2) {
-                                char ch1 = UTF8StringPointable.charAt(strBytes, s1Start + c1);
-                                char ch2 = UTF8StringPointable.charAt(patternBytes, s2Start + c2);
-
-                                if (ch1 != ch2) {
-                                    break;
-                                }
-                                c1 += UTF8StringPointable.charSize(strBytes, s1Start + c1);
-                                c2 += UTF8StringPointable.charSize(patternBytes, s2Start + c2);
-                            }
-                            if (c2 == utflen2) {
-                                matches = true;
-                                break;
-                            }
-                            startMatch += UTF8StringPointable.charSize(strBytes, s1Start + startMatch);
-                        }
-                        return matches;
-                    }
-
-                };
-            }
-        };
-    }
-
-    @Override
-    public FunctionIdentifier getIdentifier() {
-        return AsterixBuiltinFunctions.CONTAINS;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
index e94aacf..15ce3d4 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
@@ -89,6 +89,8 @@ public class EditDistanceStringIsFilterable extends AbstractScalarFunctionDynami
         private final ISerializerDeserializer<ABoolean> booleanSerde = AqlSerializerDeserializerProvider.INSTANCE
                 .getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
+        private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
+
         public EditDistanceStringIsFilterableEvaluator(ICopyEvaluatorFactory[] args, IDataOutputProvider output)
                 throws AlgebricksException {
             this.output = output;
@@ -110,14 +112,9 @@ public class EditDistanceStringIsFilterable extends AbstractScalarFunctionDynami
                 throw new AlgebricksException(AsterixBuiltinFunctions.EDIT_DISTANCE_STRING_IS_FILTERABLE.getName()
                         + ": expects input type STRING as first argument, but got " + typeTag + ".");
             }
-            int utf8Length = UTF8StringPointable.getUTFLength(argBuf.getByteArray(), 1);
-            int pos = 3;
-            long strLen = 0;
-            int end = pos + utf8Length;
-            while (pos < end) {
-                strLen++;
-                pos += UTF8StringPointable.charSize(argBuf.getByteArray(), pos);
-            }
+
+            utf8Ptr.set(argBuf.getByteArray(), 1, argBuf.getLength());
+            int strLen = utf8Ptr.getStringLength();
 
             // Check type and extract edit-distance threshold.
             argBuf.reset();

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EndsWithDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EndsWithDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EndsWithDescriptor.java
deleted file mode 100644
index c3bfcc1..0000000
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EndsWithDescriptor.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.evaluators.functions;
-
-import java.io.DataOutput;
-
-import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
-import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluator;
-import org.apache.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
-import org.apache.hyracks.data.std.api.IDataOutputProvider;
-import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-
-public class EndsWithDescriptor extends AbstractScalarFunctionDynamicDescriptor {
-    private static final long serialVersionUID = 1L;
-
-    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
-        public IFunctionDescriptor createFunctionDescriptor() {
-            return new EndsWithDescriptor();
-        }
-    };
-
-    @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 AbstractStringContainsEval(dout, args[0], args[1], AsterixBuiltinFunctions.ENDS_WITH) {
-
-                    @Override
-                    protected boolean findMatch(byte[] strBytes, byte[] patternBytes) {
-                        int utflen1 = UTF8StringPointable.getUTFLength(strBytes, 1);
-                        int utflen2 = UTF8StringPointable.getUTFLength(patternBytes, 1);
-
-                        int s1Start = 3;
-                        int s2Start = 3;
-
-                        int startMatch = utflen1 - utflen2;
-                        if (startMatch < 0) {
-                            return false;
-                        }
-                        int c1 = 0;
-                        while (c1 < startMatch) {
-                            c1 += UTF8StringPointable.charSize(strBytes, s1Start + c1);
-                        }
-                        int c2 = 0;
-                        while (c1 < utflen1 && c2 < utflen2) {
-                            char ch1 = UTF8StringPointable.charAt(strBytes, s1Start + c1);
-                            char ch2 = UTF8StringPointable.charAt(patternBytes, s2Start + c2);
-                            if (ch1 != ch2) {
-                                break;
-                            }
-                            c1 += UTF8StringPointable.charSize(strBytes, s1Start + c1);
-                            c2 += UTF8StringPointable.charSize(patternBytes, s2Start + c2);
-                        }
-                        return (c2 == utflen2);
-                    }
-
-                };
-            }
-        };
-    }
-
-    @Override
-    public FunctionIdentifier getIdentifier() {
-        return AsterixBuiltinFunctions.ENDS_WITH;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
index 15e623e..e7e90ad 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsNullDescriptor.java
@@ -60,6 +60,7 @@ public class IsNullDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                     private DataOutput out = output.getDataOutput();
                     private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
                     private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+                    private final AObjectSerializerDeserializer aObjSerDer = new AObjectSerializerDeserializer();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -68,7 +69,7 @@ public class IsNullDescriptor extends AbstractScalarFunctionDynamicDescriptor {
                         boolean isNull = argOut.getByteArray()[argOut.getStartOffset()] == SER_NULL_TYPE_TAG;
                         ABoolean res = isNull ? ABoolean.TRUE : ABoolean.FALSE;
                         try {
-                            AObjectSerializerDeserializer.INSTANCE.serialize(res, out);
+                            aObjSerDer.serialize(res, out);
                         } catch (HyracksDataException e) {
                             throw new AlgebricksException(e);
                         }

http://git-wip-us.apache.org/repos/asf/incubator-asterixdb/blob/742aba85/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
----------------------------------------------------------------------
diff --git a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
index 83533ba..47ae0d6 100644
--- a/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
+++ b/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsSystemNullDescriptor.java
@@ -60,6 +60,7 @@ public class IsSystemNullDescriptor extends AbstractScalarFunctionDynamicDescrip
                     private DataOutput out = output.getDataOutput();
                     private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
                     private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+                    private final AObjectSerializerDeserializer aObjSerDer = new AObjectSerializerDeserializer();
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -68,7 +69,7 @@ public class IsSystemNullDescriptor extends AbstractScalarFunctionDynamicDescrip
                         boolean isSystemNull = argOut.getByteArray()[argOut.getStartOffset()] == SER_SYSTEM_NULL_TYPE_TAG;
                         ABoolean res = isSystemNull ? ABoolean.TRUE : ABoolean.FALSE;
                         try {
-                            AObjectSerializerDeserializer.INSTANCE.serialize(res, out);
+                            aObjSerDer.serialize(res, out);
                         } catch (HyracksDataException e) {
                             throw new AlgebricksException(e);
                         }