This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 3475ed37283a1aa0aadb05dd4537af7bb0a87d09 Author: Ali Alsuliman <[email protected]> AuthorDate: Fri Feb 3 11:43:50 2023 -0800 [ASTERIXDB-3104][FUN] Add function to return the serialized ADM size of a value - user model changes: no - storage format changes: no - interface changes: no Details: Change-Id: I75de50afc22eb3cb0469bb05d9025efcebe94514 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17360 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Till Westmann <[email protected]> --- .../serialized_size_fun.01.query.sqlpp | 29 ++++++++ .../serialized_size_fun/serialized_size_fun.01.adm | 5 ++ .../test/resources/runtimets/testsuite_sqlpp.xml | 5 ++ .../asterix/om/functions/BuiltinFunctions.java | 4 + .../functions/SerializedSizeDescriptor.java | 87 ++++++++++++++++++++++ .../runtime/functions/FunctionCollection.java | 2 + 6 files changed, 132 insertions(+) diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp new file mode 100644 index 0000000000..d3c8f1ae41 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/serialized_size_fun/serialized_size_fun.01.query.sqlpp @@ -0,0 +1,29 @@ +/* + * 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. + */ +SET `import-private-functions` `true`; + +from [ +{"id": 1, "f": 1}, +{"id": 2, "f": true}, +{"id": 3, "f": "test"}, +{"id": 4, "f": [1,2]}, +{"id": 5, "f": {"f1": 1, "f2": [{"n": "str"}]}} +] AS t +select t.f AS val, serialized_size(t.f) AS serialized_size +order by t.id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm new file mode 100644 index 0000000000..511674be99 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/serialized_size_fun/serialized_size_fun.01.adm @@ -0,0 +1,5 @@ +{ "serialized_size": 9, "val": 1 } +{ "serialized_size": 2, "val": true } +{ "serialized_size": 6, "val": "test" } +{ "serialized_size": 36, "val": [ 1, 2 ] } +{ "serialized_size": 88, "val": { "f1": 1, "f2": [ { "n": "str" } ] } } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index b77dac5b85..755d65d581 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -7268,6 +7268,11 @@ <output-dir compare="Text">query-ASTERIXDB-865</output-dir> </compilation-unit> </test-case> + <test-case FilePath="misc"> + <compilation-unit name="serialized_size_fun"> + <output-dir compare="Text">serialized_size_fun</output-dir> + </compilation-unit> + </test-case> </test-group> <test-group name="multipart-dataverse"> <test-case FilePath="multipart-dataverse"> diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java index 56971ebbe2..4db68c347c 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java @@ -1699,6 +1699,9 @@ public class BuiltinFunctions { public static final FunctionIdentifier DECODE_DATAVERSE_NAME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "decode-dataverse-name", 1); + public static final FunctionIdentifier SERIALIZED_SIZE = + new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "serialized-size", 1); + static { // first, take care of Algebricks builtin functions addFunction(IS_MISSING, BooleanOnlyTypeComputer.INSTANCE, true); @@ -2530,6 +2533,7 @@ public class BuiltinFunctions { addFunction(DECODE_DATAVERSE_NAME, OrderedListOfAStringTypeComputer.INSTANCE_NULLABLE, true); addPrivateFunction(COLLECTION_TO_SEQUENCE, CollectionToSequenceTypeComputer.INSTANCE, true); + addPrivateFunction(SERIALIZED_SIZE, AInt64TypeComputer.INSTANCE, true); // external lookup addPrivateFunction(EXTERNAL_LOOKUP, AnyTypeComputer.INSTANCE, false); diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java new file mode 100644 index 0000000000..2669fd714c --- /dev/null +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SerializedSizeDescriptor.java @@ -0,0 +1,87 @@ +/* + * 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 java.io.IOException; + +import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; +import org.apache.asterix.om.base.AInt64; +import org.apache.asterix.om.base.AMutableInt64; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.types.BuiltinType; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.api.IPointable; +import org.apache.hyracks.data.std.primitive.VoidPointable; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; +import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; + +public final class SerializedSizeDescriptor extends AbstractScalarFunctionDynamicDescriptor { + private static final long serialVersionUID = 1L; + + public static final IFunctionDescriptorFactory FACTORY = SerializedSizeDescriptor::new; + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException { + return new AbstractScalarEval(sourceLoc, getIdentifier()) { + private final IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx); + private final VoidPointable arg0 = VoidPointable.FACTORY.createPointable(); + private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage(); + private final DataOutput resultOut = resultStorage.getDataOutput(); + + @SuppressWarnings("unchecked") + private final ISerializerDeserializer<AInt64> int64Serde = + SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64); + private final AMutableInt64 int64 = new AMutableInt64(0); + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + resultStorage.reset(); + eval0.evaluate(tuple, arg0); + int64.setValue(arg0.getLength()); + try { + int64Serde.serialize(int64, resultOut); + result.set(resultStorage); + } catch (IOException e) { + throw HyracksDataException.create(e); + } + } + }; + } + }; + } + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.SERIALIZED_SIZE; + } +} diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java index 35993cf2b6..867a8d0c4c 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java @@ -446,6 +446,7 @@ import org.apache.asterix.runtime.evaluators.functions.OrDescriptor; import org.apache.asterix.runtime.evaluators.functions.RandomDescriptor; import org.apache.asterix.runtime.evaluators.functions.RandomWithSeedDescriptor; import org.apache.asterix.runtime.evaluators.functions.ReferenceTileDescriptor; +import org.apache.asterix.runtime.evaluators.functions.SerializedSizeDescriptor; import org.apache.asterix.runtime.evaluators.functions.SleepDescriptor; import org.apache.asterix.runtime.evaluators.functions.SpatialAreaDescriptor; import org.apache.asterix.runtime.evaluators.functions.SpatialCellDescriptor; @@ -1315,6 +1316,7 @@ public final class FunctionCollection implements IFunctionCollection { // Other functions fc.add(DecodeDataverseNameDescriptor.FACTORY); fc.add(RandomWithSeedDescriptor.FACTORY); + fc.add(SerializedSizeDescriptor.FACTORY); ServiceLoader.load(IFunctionRegistrant.class).iterator().forEachRemaining(c -> c.register(fc)); return fc;
