Changes based on the code review, and dealing with nulls for the existing spatial functions.
git-svn-id: https://asterixdb.googlecode.com/svn/branches/asterix_stabilization_spatial_accessors@788 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix-app/src/test/resources/runtimets/queries/spatial/circle_accessor.aql b/asterix-app/src/test/resources/runtimets/queries/spatial/circle_accessor.aql
new file mode 100644
index 0000000..1d48ebd
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/spatial/circle_accessor.aql
@@ -0,0 +1,14 @@
+/*
+ * Description : Test spatial accessors
+ * Expected Result : Success
+ * Date : Oct 17, 2012
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"rttest/spatial_circle_accessor.adm";
+
+let $circle := create-circle(create-point(6.0,3.0), 1.0)
+return {"circle-radius": get-radius($circle), "circle-center": get-center($circle)}
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/spatial/line_accessor.aql b/asterix-app/src/test/resources/runtimets/queries/spatial/line_accessor.aql
new file mode 100644
index 0000000..2085436
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/spatial/line_accessor.aql
@@ -0,0 +1,16 @@
+/*
+ * Description : Test spatial accessors
+ * Expected Result : Success
+ * Date : Oct 17, 2012
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"rttest/spatial_line_accessor.adm";
+
+let $line := create-line(create-point(100.6,999.4), create-point(-872.0,-876.9))
+let $line_list := get-points($line)
+for $p in $line_list
+return $p
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/spatial/point_accessor.aql b/asterix-app/src/test/resources/runtimets/queries/spatial/point_accessor.aql
new file mode 100644
index 0000000..c408630
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/spatial/point_accessor.aql
@@ -0,0 +1,14 @@
+/*
+ * Description : Test spatial accessors
+ * Expected Result : Success
+ * Date : Oct 17, 2012
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"rttest/spatial_point_accessor.adm";
+
+let $point := create-point(2.3,5.0)
+return {"x-coordinate": get-x($point), "y-coordinate": get-y($point)}
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/spatial/polygon_accessor.aql b/asterix-app/src/test/resources/runtimets/queries/spatial/polygon_accessor.aql
new file mode 100644
index 0000000..a181648
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/spatial/polygon_accessor.aql
@@ -0,0 +1,16 @@
+/*
+ * Description : Test spatial accessors
+ * Expected Result : Success
+ * Date : Oct 17, 2012
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"rttest/spatial_polygon_accessor.adm";
+
+let $polygon := create-polygon(create-point(1.0,1.0), create-point(2.0,2.0), create-point(3.0,3.0), create-point(4.0,4.0))
+let $polygon_list := get-points($polygon)
+for $p in $polygon_list
+return $p
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/spatial/rectangle_accessor.aql b/asterix-app/src/test/resources/runtimets/queries/spatial/rectangle_accessor.aql
new file mode 100644
index 0000000..676888c
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/queries/spatial/rectangle_accessor.aql
@@ -0,0 +1,16 @@
+/*
+ * Description : Test spatial accessors
+ * Expected Result : Success
+ * Date : Oct 17, 2012
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+write output to nc1:"rttest/spatial_rectangle_accessor.adm";
+
+let $rectangle := create-rectangle(create-point(9.2,49.0), create-point(77.8,111.1))
+let $rectangle_list := get-points($rectangle)
+for $p in $rectangle_list
+return $p
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/spatial/spatial_accessors.aql b/asterix-app/src/test/resources/runtimets/queries/spatial/spatial_accessors.aql
deleted file mode 100644
index e87bc24..0000000
--- a/asterix-app/src/test/resources/runtimets/queries/spatial/spatial_accessors.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Description : Test spatial accessors
- * Expected Result : Success
- * Date : Oct 16, 2012
- */
-
-drop dataverse test if exists;
-create dataverse test;
-use dataverse test;
-
-write output to nc1:"rttest/spatial_spatial_accessors.adm";
-
-let $point := create-point(2.3,5.0)
-let $circle := create-circle(create-point(6.0,3.0), 1.0)
-let $line := create-line(create-point(100.6,999.4), create-point(-872.0,-876.9))
-let $rectangle := create-rectangle(create-point(9.2,49.0), create-point(77.8,111.1))
-let $polygon := create-polygon(create-point(1.0,1.0), create-point(2.0,2.0), create-point(3.0,3.0), create-point(4.0,4.0))
-let $line_list := get-points($line)
-let $rectangle_list := get-points($rectangle)
-let $polygon_list := get-points($polygon)
-return {"x-coordinate": get-x($point), "y-coordinate": get-y($point), "circle-radius": get-radius($circle), "circle-center": get-center($circle), "line-first-point": $line_list[0], "line-second-point": $line_list[1], "rectangle-left-bottom-point": $rectangle_list[0], "rectangle-top-upper-point": $rectangle_list[1], "polygon-first-point": $polygon_list[0], "polygon-second-point": $polygon_list[1], "polygon-third-point": $polygon_list[2], "polygon-forth-point": $polygon_list[3]}
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/spatial/circle_accessor.adm b/asterix-app/src/test/resources/runtimets/results/spatial/circle_accessor.adm
new file mode 100644
index 0000000..8848521
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/results/spatial/circle_accessor.adm
@@ -0,0 +1 @@
+{ "circle-radius": 1.0d, "circle-center": point("6.0,3.0") }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/spatial/line_accessor.adm b/asterix-app/src/test/resources/runtimets/results/spatial/line_accessor.adm
new file mode 100644
index 0000000..c6d1c06
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/results/spatial/line_accessor.adm
@@ -0,0 +1,2 @@
+point("100.6,999.4")
+point("-872.0,-876.9")
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/spatial/point_accessor.adm b/asterix-app/src/test/resources/runtimets/results/spatial/point_accessor.adm
new file mode 100644
index 0000000..0fa3fe4
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/results/spatial/point_accessor.adm
@@ -0,0 +1 @@
+{ "x-coordinate": 2.3d, "y-coordinate": 5.0d }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/spatial/polygon_accessor.adm b/asterix-app/src/test/resources/runtimets/results/spatial/polygon_accessor.adm
new file mode 100644
index 0000000..12685ce
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/results/spatial/polygon_accessor.adm
@@ -0,0 +1,4 @@
+point("1.0,1.0")
+point("2.0,2.0")
+point("3.0,3.0")
+point("4.0,4.0")
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/spatial/rectangle_accessor.adm b/asterix-app/src/test/resources/runtimets/results/spatial/rectangle_accessor.adm
new file mode 100644
index 0000000..f198dff
--- /dev/null
+++ b/asterix-app/src/test/resources/runtimets/results/spatial/rectangle_accessor.adm
@@ -0,0 +1,2 @@
+point("9.2,49.0")
+point("77.8,111.1")
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/spatial/spatial_accessors.adm b/asterix-app/src/test/resources/runtimets/results/spatial/spatial_accessors.adm
deleted file mode 100644
index 493a76e..0000000
--- a/asterix-app/src/test/resources/runtimets/results/spatial/spatial_accessors.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "x-coordinate": 2.3d, "y-coordinate": 5.0d, "circle-radius": 1.0d, "circle-center": point("6.0,3.0"), "line-first-point": point("100.6,999.4"), "line-second-point": point("-872.0,-876.9"), "rectangle-left-bottom-point": point("9.2,49.0"), "rectangle-top-upper-point": point("77.8,111.1"), "polygon-first-point": point("1.0,1.0"), "polygon-second-point": point("2.0,2.0"), "polygon-third-point": point("3.0,3.0"), "polygon-forth-point": point("4.0,4.0") }
\ No newline at end of file
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
index 9d6aeda..577a1fb 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
@@ -23,6 +23,7 @@
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
import edu.uci.ics.asterix.om.base.AMutablePoint;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.base.APoint;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
@@ -44,6 +45,7 @@
private static final FunctionIdentifier FID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-center", 1);
private static final byte SER_CICLE_TAG = ATypeTag.CIRCLE.serialize();
+ private final static byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -62,13 +64,16 @@
@Override
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
- private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval = args[0].createEvaluator(argOut);
- private AMutablePoint aPoint = new AMutablePoint(0, 0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<APoint> pointSerde = AqlSerializerDeserializerProvider.INSTANCE
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
+ private final AMutablePoint aPoint = new AMutablePoint(0, 0);
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<APoint> pointSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.APOINT);
@Override
@@ -85,12 +90,14 @@
ACircleSerializerDeserializer.getCenterPointCoordinateOffset(Coordinate.X));
cY = ADoubleSerializerDeserializer.getDouble(bytes,
ACircleSerializerDeserializer.getCenterPointCoordinateOffset(Coordinate.Y));
+ aPoint.setValue(cX, cY);
+ pointSerde.serialize(aPoint, out);
+ } else if (bytes[0] == SER_NULL_TYPE_TAG) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new AlgebricksException("get-center does not support the type: " + bytes[0]
+ " It is only implemented for CIRCLE.");
}
- aPoint.setValue(cX, cY);
- pointSerde.serialize(aPoint, out);
} catch (IOException e) {
throw new AlgebricksException(e);
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
index 27a4c04..ffaae9e 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
@@ -23,6 +23,7 @@
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
import edu.uci.ics.asterix.om.base.ADouble;
import edu.uci.ics.asterix.om.base.AMutableDouble;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
import edu.uci.ics.asterix.om.types.ATypeTag;
@@ -43,6 +44,7 @@
private static final FunctionIdentifier FID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-radius", 1);
private static final byte SER_CICLE_TAG = ATypeTag.CIRCLE.serialize();
+ private final static byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -61,13 +63,16 @@
@Override
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
- private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval = args[0].createEvaluator(argOut);
- private AMutableDouble aDouble = new AMutableDouble(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADouble> doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
+ private final AMutableDouble aDouble = new AMutableDouble(0);
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<ADouble> doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.ADOUBLE);
@Override
@@ -81,14 +86,15 @@
if (bytes[0] == SER_CICLE_TAG) {
radius = ADoubleSerializerDeserializer.getDouble(bytes,
ACircleSerializerDeserializer.getRadiusOffset());
+ aDouble.setValue(radius);
+ doubleSerde.serialize(aDouble, out);
+ } else if (bytes[0] == SER_NULL_TYPE_TAG) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new AlgebricksException("get-radius does not support the type: " + bytes[0]
+ " It is only implemented for CIRCLE.");
}
- aDouble.setValue(radius);
- doubleSerde.serialize(aDouble, out);
-
} catch (IOException e) {
throw new AlgebricksException(e);
}
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
index ea9c599..68ff480 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
@@ -28,6 +28,7 @@
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ARectangleSerializerDeserializer;
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
import edu.uci.ics.asterix.om.base.AMutablePoint;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.base.APoint;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
@@ -53,6 +54,7 @@
private static final byte SER_LINE_TAG = ATypeTag.LINE.serialize();
private static final byte SER_RECTANGLE_TAG = ATypeTag.RECTANGLE.serialize();
private static final byte SER_POLYGON_TAG = ATypeTag.POLYGON.serialize();
+ private final static byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -71,17 +73,20 @@
@Override
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
- private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval = args[0].createEvaluator(argOut);
- private IAOrderedListBuilder listBuilder = new OrderedListBuilder();
- private ArrayBackedValueStorage inputVal = new ArrayBackedValueStorage();
- protected final AOrderedListType pointListType = new AOrderedListType(BuiltinType.APOINT, null);
+ private final IAOrderedListBuilder listBuilder = new OrderedListBuilder();
+ private final ArrayBackedValueStorage inputVal = new ArrayBackedValueStorage();
+ private final AOrderedListType pointListType = new AOrderedListType(BuiltinType.APOINT, null);
- private AMutablePoint aPoint = new AMutablePoint(0, 0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<APoint> pointSerde = AqlSerializerDeserializerProvider.INSTANCE
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
+ private final AMutablePoint aPoint = new AMutablePoint(0, 0);
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<APoint> pointSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.APOINT);
@Override
@@ -111,6 +116,7 @@
aPoint.setValue(endX, endY);
pointSerde.serialize(aPoint, inputVal.getDataOutput());
listBuilder.addItem(inputVal);
+ listBuilder.write(out, true);
} else if (bytes[0] == SER_RECTANGLE_TAG) {
listBuilder.reset(pointListType);
@@ -132,6 +138,7 @@
aPoint.setValue(x2, y2);
pointSerde.serialize(aPoint, inputVal.getDataOutput());
listBuilder.addItem(inputVal);
+ listBuilder.write(out, true);
} else if (bytes[0] == SER_POLYGON_TAG) {
int numOfPoints = AInt16SerializerDeserializer.getShort(bytes,
@@ -151,12 +158,13 @@
pointSerde.serialize(aPoint, inputVal.getDataOutput());
listBuilder.addItem(inputVal);
}
+ listBuilder.write(out, true);
+ } else if (bytes[0] == SER_NULL_TYPE_TAG) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new AlgebricksException("get-points does not support the type: " + bytes[0]
+ " It is only implemented for LINE, RECTANGLE, or POLYGON.");
}
- listBuilder.write(out, true);
-
} catch (IOException e) {
throw new AlgebricksException(e);
}
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
index c619c4a..7fcfd20 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
@@ -24,6 +24,7 @@
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
import edu.uci.ics.asterix.om.base.ADouble;
import edu.uci.ics.asterix.om.base.AMutableDouble;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
import edu.uci.ics.asterix.om.types.ATypeTag;
@@ -44,6 +45,7 @@
private static final FunctionIdentifier FID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-x", 1);
private static final byte SER_POINT_TAG = ATypeTag.POINT.serialize();
+ private final static byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -62,13 +64,16 @@
@Override
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
- private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval = args[0].createEvaluator(argOut);
- private AMutableDouble aDouble = new AMutableDouble(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADouble> doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
+ private final AMutableDouble aDouble = new AMutableDouble(0);
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<ADouble> doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.ADOUBLE);
@Override
@@ -82,14 +87,15 @@
if (bytes[0] == SER_POINT_TAG) {
x = ADoubleSerializerDeserializer.getDouble(bytes,
APointSerializerDeserializer.getCoordinateOffset(Coordinate.X));
+ aDouble.setValue(x);
+ doubleSerde.serialize(aDouble, out);
+ } else if (bytes[0] == SER_NULL_TYPE_TAG) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new AlgebricksException("get-x does not support the type: " + bytes[0]
+ " It is only implemented for POINT.");
}
- aDouble.setValue(x);
- doubleSerde.serialize(aDouble, out);
-
} catch (IOException e) {
throw new AlgebricksException(e);
}
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
index 4e6b71e..1c47efa 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
@@ -24,6 +24,7 @@
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
import edu.uci.ics.asterix.om.base.ADouble;
import edu.uci.ics.asterix.om.base.AMutableDouble;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
import edu.uci.ics.asterix.om.types.ATypeTag;
@@ -44,6 +45,7 @@
private static final FunctionIdentifier FID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-y", 1);
private static final byte SER_POINT_TAG = ATypeTag.POINT.serialize();
+ private final static byte SER_NULL_TYPE_TAG = ATypeTag.NULL.serialize();
public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -62,13 +64,16 @@
@Override
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
- private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval = args[0].createEvaluator(argOut);
- private AMutableDouble aDouble = new AMutableDouble(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADouble> doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
+ private final AMutableDouble aDouble = new AMutableDouble(0);
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<ADouble> doubleSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.ADOUBLE);
@Override
@@ -82,14 +87,15 @@
if (bytes[0] == SER_POINT_TAG) {
y = ADoubleSerializerDeserializer.getDouble(bytes,
APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y));
+ aDouble.setValue(y);
+ doubleSerde.serialize(aDouble, out);
+ } else if (bytes[0] == SER_NULL_TYPE_TAG) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new AlgebricksException("get-y does not support the type: " + bytes[0]
+ " It is only implemented for POINT.");
}
- aDouble.setValue(y);
- doubleSerde.serialize(aDouble, out);
-
} catch (IOException e) {
throw new AlgebricksException(e);
}
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java
index c641f1a..d4d1619 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialAreaDescriptor.java
@@ -9,9 +9,12 @@
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ARectangleSerializerDeserializer;
+import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
import edu.uci.ics.asterix.om.types.ATypeTag;
+import edu.uci.ics.asterix.om.types.BuiltinType;
import edu.uci.ics.asterix.om.types.EnumDeserializer;
import edu.uci.ics.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import edu.uci.ics.asterix.runtime.evaluators.common.SpatialUtils;
@@ -20,6 +23,7 @@
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluator;
import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
+import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
import edu.uci.ics.hyracks.data.std.api.IDataOutputProvider;
import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -44,9 +48,13 @@
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
- private ICopyEvaluator eval = args[0].createEvaluator(argOut);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage argOut = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval = args[0].createEvaluator(argOut);
+
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
@Override
public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -66,11 +74,15 @@
throw new AlgebricksException("Polygon must have at least 3 points");
}
area = Math.abs(SpatialUtils.polygonArea(argOut.getByteArray(), numOfPoints));
+ out.writeByte(ATypeTag.DOUBLE.serialize());
+ out.writeDouble(area);
break;
case CIRCLE:
double radius = ADoubleSerializerDeserializer.getDouble(argOut.getByteArray(),
ACircleSerializerDeserializer.getRadiusOffset());
area = SpatialUtils.pi() * radius * radius;
+ out.writeByte(ATypeTag.DOUBLE.serialize());
+ out.writeDouble(area);
break;
case RECTANGLE:
double x1 = ADoubleSerializerDeserializer.getDouble(argOut.getByteArray(),
@@ -87,13 +99,16 @@
ARectangleSerializerDeserializer
.getUpperRightCoordinateOffset(Coordinate.Y));
area = (x2 - x1) * (y2 - y1);
+ out.writeByte(ATypeTag.DOUBLE.serialize());
+ out.writeDouble(area);
+ break;
+ case NULL:
+ nullSerde.serialize(ANull.NULL, out);
break;
default:
throw new NotImplementedException("spatial-area does not support the type: " + tag
+ " It is only implemented for POLYGON, CIRCLE and RECTANGLE.");
}
- out.writeByte(ATypeTag.DOUBLE.serialize());
- out.writeDouble(area);
} catch (HyracksDataException hde) {
throw new AlgebricksException(hde);
} catch (IOException e) {
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java
index 1426f91..3d918d8 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialCellDescriptor.java
@@ -10,6 +10,7 @@
import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
import edu.uci.ics.asterix.om.base.AMutablePoint;
import edu.uci.ics.asterix.om.base.AMutableRectangle;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.base.ARectangle;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
@@ -46,20 +47,24 @@
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
+ private final DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage outInput0 = new ArrayBackedValueStorage();
- private ArrayBackedValueStorage outInput1 = new ArrayBackedValueStorage();
- private ArrayBackedValueStorage outInput2 = new ArrayBackedValueStorage();
- private ArrayBackedValueStorage outInput3 = new ArrayBackedValueStorage();
- private ICopyEvaluator eval0 = args[0].createEvaluator(outInput0);
- private ICopyEvaluator eval1 = args[1].createEvaluator(outInput1);
- private ICopyEvaluator eval2 = args[2].createEvaluator(outInput2);
- private ICopyEvaluator eval3 = args[3].createEvaluator(outInput3);
- private AMutableRectangle aRectangle = new AMutableRectangle(null, null);
- private AMutablePoint[] aPoint = { new AMutablePoint(0, 0), new AMutablePoint(0, 0) };
+ private final ArrayBackedValueStorage outInput0 = new ArrayBackedValueStorage();
+ private final ArrayBackedValueStorage outInput1 = new ArrayBackedValueStorage();
+ private final ArrayBackedValueStorage outInput2 = new ArrayBackedValueStorage();
+ private final ArrayBackedValueStorage outInput3 = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval0 = args[0].createEvaluator(outInput0);
+ private final ICopyEvaluator eval1 = args[1].createEvaluator(outInput1);
+ private final ICopyEvaluator eval2 = args[2].createEvaluator(outInput2);
+ private final ICopyEvaluator eval3 = args[3].createEvaluator(outInput3);
+ private final AMutableRectangle aRectangle = new AMutableRectangle(null, null);
+ private final AMutablePoint[] aPoint = { new AMutablePoint(0, 0), new AMutablePoint(0, 0) };
+
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ARectangle> rectangleSerde = AqlSerializerDeserializerProvider.INSTANCE
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<ARectangle> rectangleSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.ARECTANGLE);
@Override
@@ -96,6 +101,8 @@
aPoint[1].setValue(x + xInc, y + yInc);
aRectangle.setValue(aPoint[0], aPoint[1]);
rectangleSerde.serialize(aRectangle, out);
+ } else if (tag == ATypeTag.NULL) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new NotImplementedException("spatial-cell does not support the type: " + tag
+ " It is only implemented for POINT.");
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java
index d83f62e..63032b9 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/SpatialDistanceDescriptor.java
@@ -7,9 +7,12 @@
import edu.uci.ics.asterix.dataflow.data.nontagged.Coordinate;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.APointSerializerDeserializer;
+import edu.uci.ics.asterix.formats.nontagged.AqlSerializerDeserializerProvider;
+import edu.uci.ics.asterix.om.base.ANull;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptor;
import edu.uci.ics.asterix.om.functions.IFunctionDescriptorFactory;
import edu.uci.ics.asterix.om.types.ATypeTag;
+import edu.uci.ics.asterix.om.types.BuiltinType;
import edu.uci.ics.asterix.om.types.EnumDeserializer;
import edu.uci.ics.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -17,6 +20,7 @@
import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluator;
import edu.uci.ics.hyracks.algebricks.runtime.base.ICopyEvaluatorFactory;
+import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
import edu.uci.ics.hyracks.data.std.api.IDataOutputProvider;
import edu.uci.ics.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -42,11 +46,15 @@
public ICopyEvaluator createEvaluator(final IDataOutputProvider output) throws AlgebricksException {
return new ICopyEvaluator() {
- private DataOutput out = output.getDataOutput();
- private ArrayBackedValueStorage outInput0 = new ArrayBackedValueStorage();
- private ArrayBackedValueStorage outInput1 = new ArrayBackedValueStorage();
- private ICopyEvaluator eval0 = args[0].createEvaluator(outInput0);
- private ICopyEvaluator eval1 = args[1].createEvaluator(outInput1);
+ private final DataOutput out = output.getDataOutput();
+ private final ArrayBackedValueStorage outInput0 = new ArrayBackedValueStorage();
+ private final ArrayBackedValueStorage outInput1 = new ArrayBackedValueStorage();
+ private final ICopyEvaluator eval0 = args[0].createEvaluator(outInput0);
+ private final ICopyEvaluator eval1 = args[1].createEvaluator(outInput1);
+
+ @SuppressWarnings("unchecked")
+ private final ISerializerDeserializer<ANull> nullSerde = AqlSerializerDeserializerProvider.INSTANCE
+ .getSerializerDeserializer(BuiltinType.ANULL);
@Override
public void evaluate(IFrameTupleReference tuple) throws AlgebricksException {
@@ -76,6 +84,8 @@
throw new NotImplementedException("spatial-distance does not support the type: "
+ tag1 + " It is only implemented for POINT.");
}
+ } else if (tag0 == ATypeTag.NULL || tag1 == ATypeTag.NULL) {
+ nullSerde.serialize(ANull.NULL, out);
} else {
throw new NotImplementedException("spatial-distance does not support the type: " + tag0
+ " It is only implemented for POINT.");
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/formats/NonTaggedDataFormat.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/formats/NonTaggedDataFormat.java
index 4665631..07c21fb 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/formats/NonTaggedDataFormat.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/formats/NonTaggedDataFormat.java
@@ -285,7 +285,6 @@
temp.add(NonEmptyStreamAggregateDescriptor.FACTORY);
temp.add(RangeDescriptor.FACTORY);
- // Xiaoyu Ma add for numeric unary functions
temp.add(NumericAbsDescriptor.FACTORY);
temp.add(NumericCeilingDescriptor.FACTORY);
temp.add(NumericFloorDescriptor.FACTORY);