http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java index 7a24400..a081fb4 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java @@ -41,6 +41,7 @@ import org.apache.asterix.common.metadata.LockList; import org.apache.asterix.common.transactions.TxnId; import org.apache.asterix.common.utils.StoragePathUtil; import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory; +import org.apache.asterix.dataflow.data.nontagged.serde.SerializerDeserializerUtil; import org.apache.asterix.external.adapter.factory.LookupAdapterFactory; import org.apache.asterix.external.api.IAdapterFactory; import org.apache.asterix.external.api.IDataSourceAdapter; @@ -432,7 +433,7 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> IOperatorSchema opSchema, IVariableTypeEnvironment typeEnv, JobGenContext context, boolean retainInput, boolean retainMissing, Dataset dataset, String indexName, int[] lowKeyFields, int[] highKeyFields, boolean lowKeyInclusive, boolean highKeyInclusive, boolean propagateFilter, int[] minFilterFieldIndexes, - int[] maxFilterFieldIndexes) throws AlgebricksException { + int[] maxFilterFieldIndexes, boolean isIndexOnlyPlan) throws AlgebricksException { boolean isSecondary = true; Index primaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(), dataset.getDatasetName(), dataset.getDatasetName()); @@ -450,16 +451,34 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> primaryKeyFields[i] = i; } - ISearchOperationCallbackFactory searchCallbackFactory = dataset - .getSearchCallbackFactory(storageComponentProvider, theIndex, IndexOperation.SEARCH, primaryKeyFields); + int[] primaryKeyFieldsInSecondaryIndex = null; + byte[] successValueForIndexOnlyPlan = null; + byte[] failValueForIndexOnlyPlan = null; + boolean proceedIndexOnlyPlan = isIndexOnlyPlan && isSecondary; + if (proceedIndexOnlyPlan) { + int numSecondaryKeys = theIndex.getKeyFieldNames().size(); + primaryKeyFieldsInSecondaryIndex = new int[numPrimaryKeys]; + for (int i = 0; i < numPrimaryKeys; i++) { + primaryKeyFieldsInSecondaryIndex[i] = i + numSecondaryKeys; + } + // Defines the return value from a secondary index search if this is an index-only plan. + failValueForIndexOnlyPlan = SerializerDeserializerUtil.computeByteArrayForIntValue(0); + successValueForIndexOnlyPlan = SerializerDeserializerUtil.computeByteArrayForIntValue(1); + } + + ISearchOperationCallbackFactory searchCallbackFactory = + dataset.getSearchCallbackFactory(storageComponentProvider, theIndex, IndexOperation.SEARCH, + primaryKeyFields, primaryKeyFieldsInSecondaryIndex, proceedIndexOnlyPlan); IStorageManager storageManager = getStorageComponentProvider().getStorageManager(); IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(storageManager, spPc.first); BTreeSearchOperatorDescriptor btreeSearchOp; + if (dataset.getDatasetType() == DatasetType.INTERNAL) { btreeSearchOp = new BTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, lowKeyFields, highKeyFields, lowKeyInclusive, highKeyInclusive, indexHelperFactory, retainInput, retainMissing, context.getMissingWriterFactory(), searchCallbackFactory, minFilterFieldIndexes, - maxFilterFieldIndexes, propagateFilter); + maxFilterFieldIndexes, propagateFilter, proceedIndexOnlyPlan, failValueForIndexOnlyPlan, + successValueForIndexOnlyPlan); } else { btreeSearchOp = new ExternalBTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, lowKeyFields, highKeyFields, lowKeyInclusive, highKeyInclusive, indexHelperFactory, retainInput, retainMissing, @@ -472,8 +491,8 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> buildRtreeRuntime(JobSpecification jobSpec, List<LogicalVariable> outputVars, IOperatorSchema opSchema, IVariableTypeEnvironment typeEnv, JobGenContext context, boolean retainInput, boolean retainMissing, Dataset dataset, String indexName, - int[] keyFields, boolean propagateFilter, int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes) - throws AlgebricksException { + int[] keyFields, boolean propagateFilter, int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes, + boolean isIndexOnlyPlan) throws AlgebricksException { int numPrimaryKeys = dataset.getPrimaryKeys().size(); Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(), dataset.getDatasetName(), indexName); @@ -489,15 +508,38 @@ public class MetadataProvider implements IMetadataProvider<DataSourceId, String> primaryKeyFields[i] = i; } - ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory( - storageComponentProvider, secondaryIndex, IndexOperation.SEARCH, primaryKeyFields); + int[] primaryKeyFieldsInSecondaryIndex = null; + byte[] successValueForIndexOnlyPlan = null; + byte[] failValueForIndexOnlyPlan = null; + if (isIndexOnlyPlan) { + ARecordType recType = (ARecordType) findType(dataset.getItemTypeDataverseName(), dataset.getItemTypeName()); + List<List<String>> secondaryKeyFields = secondaryIndex.getKeyFieldNames(); + List<IAType> secondaryKeyTypes = secondaryIndex.getKeyFieldTypes(); + Pair<IAType, Boolean> keyTypePair = + Index.getNonNullableOpenFieldType(secondaryKeyTypes.get(0), secondaryKeyFields.get(0), recType); + IAType keyType = keyTypePair.first; + int numDimensions = NonTaggedFormatUtil.getNumDimensions(keyType.getTypeTag()); + int numNestedSecondaryKeyFields = numDimensions * 2; + primaryKeyFieldsInSecondaryIndex = new int[numPrimaryKeys]; + for (int i = 0; i < numPrimaryKeys; i++) { + primaryKeyFieldsInSecondaryIndex[i] = i + numNestedSecondaryKeyFields; + } + // Defines the return value from a secondary index search if this is an index-only plan. + failValueForIndexOnlyPlan = SerializerDeserializerUtil.computeByteArrayForIntValue(0); + successValueForIndexOnlyPlan = SerializerDeserializerUtil.computeByteArrayForIntValue(1); + } + + ISearchOperationCallbackFactory searchCallbackFactory = + dataset.getSearchCallbackFactory(storageComponentProvider, secondaryIndex, IndexOperation.SEARCH, + primaryKeyFields, primaryKeyFieldsInSecondaryIndex, isIndexOnlyPlan); RTreeSearchOperatorDescriptor rtreeSearchOp; IIndexDataflowHelperFactory indexDataflowHelperFactory = new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), spPc.first); if (dataset.getDatasetType() == DatasetType.INTERNAL) { rtreeSearchOp = new RTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, keyFields, true, true, indexDataflowHelperFactory, retainInput, retainMissing, context.getMissingWriterFactory(), - searchCallbackFactory, minFilterFieldIndexes, maxFilterFieldIndexes, propagateFilter); + searchCallbackFactory, minFilterFieldIndexes, maxFilterFieldIndexes, propagateFilter, + isIndexOnlyPlan, failValueForIndexOnlyPlan, successValueForIndexOnlyPlan); } else { // Create the operator rtreeSearchOp = new ExternalRTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, keyFields, true, true,
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java index 8cd7053..7981309 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java @@ -71,6 +71,7 @@ import org.apache.asterix.transaction.management.opcallbacks.LockThenSearchOpera import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexInstantSearchOperationCallbackFactory; import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexModificationOperationCallbackFactory; import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexOperationTrackerFactory; +import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexInstanctSearchOperationCallbackFactory; import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexModificationOperationCallbackFactory; import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexOperationTrackerFactory; import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexSearchOperationCallbackFactory; @@ -540,20 +541,28 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { /** * Get search callback factory for this dataset with the passed index and operation * + * @param storageComponentProvider + * storage component provider * @param index * the index * @param op * the operation this search is part of * @param primaryKeyFields * the primary key fields indexes for locking purposes + * @param primaryKeyFieldsInSecondaryIndex + * the primary key fields indexes in the given secondary index (used for index-only plan) + * @param proceedIndexOnlyPlan + * the given plan is an index-only plan? (used for index-only plan) * @return * an instance of {@link org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory} * @throws AlgebricksException * if the callback factory could not be created */ public ISearchOperationCallbackFactory getSearchCallbackFactory(IStorageComponentProvider storageComponentProvider, - Index index, IndexOperation op, int[] primaryKeyFields) throws AlgebricksException { + Index index, IndexOperation op, int[] primaryKeyFields, int[] primaryKeyFieldsInSecondaryIndex, + boolean proceedIndexOnlyPlan) throws AlgebricksException { if (index.isPrimaryIndex()) { + /** /* * Due to the read-committed isolation level, * we may acquire very short duration lock(i.e., instant lock) for readers. @@ -563,6 +572,12 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { storageComponentProvider.getTransactionSubsystemProvider(), ResourceType.LSM_BTREE) : new PrimaryIndexInstantSearchOperationCallbackFactory(getDatasetId(), primaryKeyFields, storageComponentProvider.getTransactionSubsystemProvider(), ResourceType.LSM_BTREE); + } else if (proceedIndexOnlyPlan) { + // Index-only plan case: we need to execute instantTryLock on PK during a secondary-index search. + // TODO: ResourceType is never used in the Callbackfactory. Should we keep it? + return new SecondaryIndexInstanctSearchOperationCallbackFactory(getDatasetId(), + primaryKeyFieldsInSecondaryIndex, storageComponentProvider.getTransactionSubsystemProvider(), + index.resourceType()); } else if (index.getKeyFieldNames().isEmpty()) { // this is the case where the index is secondary primary index and locking is required // since the secondary primary index replaces the dataset index (which locks) @@ -573,6 +588,27 @@ public class Dataset implements IMetadataEntity<Dataset>, IDataset { } /** + * Get search callback factory for this dataset with the passed index and operation + * + * @param storageComponentProvider + * storage component provider + * @param index + * the index + * @param op + * the operation this search is part of + * @param primaryKeyFields + * the primary key fields indexes for locking purposes + * @return + * an instance of {@link org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory} + * @throws AlgebricksException + * if the callback factory could not be created + */ + public ISearchOperationCallbackFactory getSearchCallbackFactory(IStorageComponentProvider storageComponentProvider, + Index index, IndexOperation op, int[] primaryKeyFields) throws AlgebricksException { + return getSearchCallbackFactory(storageComponentProvider, index, op, primaryKeyFields, null, false); + } + + /** * Get the modification callback factory associated with this dataset, the passed index, and operation. * * @param index http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerUtil.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerUtil.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerUtil.java index b0844ae..4ea2c13 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerUtil.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerUtil.java @@ -22,11 +22,16 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.om.base.AInt32; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; import org.apache.asterix.om.types.EnumDeserializer; import org.apache.asterix.om.types.IAType; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.data.std.util.ArrayBackedValueStorage; public final class SerializerDeserializerUtil { @@ -77,4 +82,20 @@ public final class SerializerDeserializerUtil { throw HyracksDataException.create(e); } } + + /** + * Computes and returns the byte array for an integer value. + */ + public static byte[] computeByteArrayForIntValue(int value) throws AlgebricksException { + ArrayBackedValueStorage castBuffer = new ArrayBackedValueStorage(); + try { + AInt32 val = new AInt32(value); + SerializerDeserializerUtil.serializeTag(val, castBuffer.getDataOutput()); + AInt32SerializerDeserializer.INSTANCE.serialize(val, castBuffer.getDataOutput()); + } catch (HyracksDataException e) { + throw CompilationException.create(ErrorCode.CANNOT_SERIALIZE_A_VALUE, e); + } + return castBuffer.getByteArray(); + } + } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java index 2a47337..67514a3 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ATypeHierarchy.java @@ -28,6 +28,8 @@ import java.util.Map; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; +import org.apache.asterix.om.base.ADouble; +import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.constants.AsterixConstantValue; import org.apache.asterix.om.types.ATypeTag; @@ -193,12 +195,14 @@ public class ATypeHierarchy { // Get an AsterixConstantValue from a source Object public static AsterixConstantValue getAsterixConstantValueFromNumericTypeObject(IAObject sourceObject, ATypeTag targetTypeTag) throws HyracksDataException { - return getAsterixConstantValueFromNumericTypeObject(sourceObject, targetTypeTag, false); + return getAsterixConstantValueFromNumericTypeObject(sourceObject, targetTypeTag, false, + TypeCastingMathFunctionType.NONE); } // Get an AsterixConstantValue from a source Object public static AsterixConstantValue getAsterixConstantValueFromNumericTypeObject(IAObject sourceObject, - ATypeTag targetTypeTag, boolean strictDemote) throws HyracksDataException { + ATypeTag targetTypeTag, boolean strictDemote, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { ATypeTag sourceTypeTag = sourceObject.getType().getTypeTag(); if (sourceTypeTag == targetTypeTag) { return new AsterixConstantValue(sourceObject); @@ -215,19 +219,19 @@ public class ATypeHierarchy { return null; } - IAObject targetObject = convertComputer.convertType(sourceObject); + IAObject targetObject = convertComputer.convertType(sourceObject, mathFunction); return new AsterixConstantValue(targetObject); } // Type Casting from source Object to an Object with Target type public static IAObject convertNumericTypeObject(IAObject sourceObject, ATypeTag targetTypeTag) throws HyracksDataException { - return convertNumericTypeObject(sourceObject, targetTypeTag, false); + return convertNumericTypeObject(sourceObject, targetTypeTag, false, TypeCastingMathFunctionType.NONE); } // Type Casting from source Object to an Object with Target type - public static IAObject convertNumericTypeObject(IAObject sourceObject, ATypeTag targetTypeTag, boolean strictDemote) - throws HyracksDataException { + public static IAObject convertNumericTypeObject(IAObject sourceObject, ATypeTag targetTypeTag, boolean strictDemote, + TypeCastingMathFunctionType mathFunction) throws HyracksDataException { ATypeTag sourceTypeTag = sourceObject.getType().getTypeTag(); if (sourceTypeTag == targetTypeTag) { return sourceObject; @@ -243,7 +247,7 @@ public class ATypeHierarchy { throw new RuntimeDataException(ErrorCode.TYPE_CONVERT, sourceTypeTag, targetTypeTag); } - return convertComputer.convertType(sourceObject); + return convertComputer.convertType(sourceObject, mathFunction); } // convert a numeric value in a byte array to the target type value @@ -388,10 +392,46 @@ public class ATypeHierarchy { } } + /** + * Applies certain math function (e.g., ceil or floor) to a double value and returns that value. + */ + public static double applyMathFunctionToDoubleValue(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws RuntimeDataException { + switch (mathFunction) { + case CEIL: + return Math.ceil(((ADouble) sourceObject).getDoubleValue()); + case FLOOR: + return Math.floor(((ADouble) sourceObject).getDoubleValue()); + default: + return ((ADouble) sourceObject).getDoubleValue(); + } + } + + /** + * Applies certain math function (e.g., ceil or floor) to a float value and returns that value. + */ + public static float applyMathFunctionToFloatValue(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) { + switch (mathFunction) { + case CEIL: + return (float) Math.ceil(((AFloat) sourceObject).getFloatValue()); + case FLOOR: + return (float) Math.floor(((AFloat) sourceObject).getFloatValue()); + default: + return ((AFloat) sourceObject).getFloatValue(); + } + } + public enum Domain { SPATIAL, NUMERIC, LIST, ANY } + + // Type-casting mathFunction that will be used to type-cast a FLOAT or a DOUBLE value into an INTEGER value. + public enum TypeCastingMathFunctionType { + CEIL, + FLOOR, + NONE + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToFloatTypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToFloatTypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToFloatTypeConvertComputer.java index 70aa283..361d06a 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToFloatTypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToFloatTypeConvertComputer.java @@ -27,6 +27,7 @@ import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.DoublePointable; @@ -55,7 +56,12 @@ public class DoubleToFloatTypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + if (mathFunction != TypeCastingMathFunctionType.NONE) { + throw new RuntimeDataException(ErrorCode.INVALID_TYPE_CASTING_MATH_FUNCTION, mathFunction, ATypeTag.DOUBLE, + ATypeTag.FLOAT); + } double sourceValue = ((ADouble) sourceObject).getDoubleValue(); float targetValue = convert(sourceValue); return new AFloat(targetValue); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java index 1c69dc4..85d71a8 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt16TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AInt16; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.DoublePointable; @@ -55,8 +55,9 @@ public class DoubleToInt16TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - double sourceValue = ((ADouble) sourceObject).getDoubleValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + double sourceValue = ATypeHierarchy.applyMathFunctionToDoubleValue(sourceObject, mathFunction); short targetValue = convert(sourceValue); return new AInt16(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt32TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt32TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt32TypeConvertComputer.java index 7d2f121..8bd9f3e 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt32TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt32TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AInt32; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.DoublePointable; @@ -59,8 +59,9 @@ public class DoubleToInt32TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - double sourceValue = ((ADouble) sourceObject).getDoubleValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + double sourceValue = ATypeHierarchy.applyMathFunctionToDoubleValue(sourceObject, mathFunction); int targetValue = convert(sourceValue); return new AInt32(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt64TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt64TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt64TypeConvertComputer.java index 6098afa..cb9a6bc 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt64TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt64TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AInt64; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.DoublePointable; @@ -63,8 +63,9 @@ public class DoubleToInt64TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - double sourceValue = ((ADouble) sourceObject).getDoubleValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + double sourceValue = ATypeHierarchy.applyMathFunctionToDoubleValue(sourceObject, mathFunction); long targetValue = convert(sourceValue); return new AInt64(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt8TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt8TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt8TypeConvertComputer.java index bb1ccc3..69934b5 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt8TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/DoubleToInt8TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AInt8; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.DoublePointable; @@ -55,8 +55,9 @@ public class DoubleToInt8TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - double sourceValue = ((ADouble) sourceObject).getDoubleValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + double sourceValue = ATypeHierarchy.applyMathFunctionToDoubleValue(sourceObject, mathFunction); byte targetValue = convert(sourceValue); return new AInt8(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToDoubleTypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToDoubleTypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToDoubleTypeConvertComputer.java index 548768e..7f780ce 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToDoubleTypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToDoubleTypeConvertComputer.java @@ -21,10 +21,13 @@ package org.apache.asterix.om.types.hierachy; import java.io.DataOutput; import java.io.IOException; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.common.exceptions.RuntimeDataException; import org.apache.asterix.om.base.ADouble; import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.FloatPointable; import org.apache.hyracks.dataflow.common.data.marshalling.DoubleSerializerDeserializer; @@ -48,7 +51,12 @@ public class FloatToDoubleTypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + if (mathFunction != TypeCastingMathFunctionType.NONE) { + throw new RuntimeDataException(ErrorCode.INVALID_TYPE_CASTING_MATH_FUNCTION, mathFunction, ATypeTag.FLOAT, + ATypeTag.DOUBLE); + } double targetValue = ((AFloat) sourceObject).getFloatValue(); return new ADouble(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt16TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt16TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt16TypeConvertComputer.java index ed570fc..4906c56 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt16TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt16TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.AInt16; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.FloatPointable; @@ -55,8 +55,9 @@ public class FloatToInt16TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - float sourceValue = ((AFloat) sourceObject).getFloatValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + float sourceValue = ATypeHierarchy.applyMathFunctionToFloatValue(sourceObject, mathFunction); short targetValue = convert(sourceValue); return new AInt16(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt32TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt32TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt32TypeConvertComputer.java index 2c81c8e..366278d 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt32TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt32TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.AInt32; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.FloatPointable; @@ -59,8 +59,9 @@ public class FloatToInt32TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - float sourceValue = ((AFloat) sourceObject).getFloatValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + float sourceValue = ATypeHierarchy.applyMathFunctionToFloatValue(sourceObject, mathFunction); int targetValue = convert(sourceValue); return new AInt32(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt64TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt64TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt64TypeConvertComputer.java index 9180785..291cab6 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt64TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt64TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.AInt64; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.FloatPointable; @@ -54,8 +54,9 @@ public class FloatToInt64TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - float sourceValue = ((AFloat) sourceObject).getFloatValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + float sourceValue = ATypeHierarchy.applyMathFunctionToFloatValue(sourceObject, mathFunction); long targetValue = convert(sourceValue); return new AInt64(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt8TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt8TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt8TypeConvertComputer.java index 43a5e76..30f19c3 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt8TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/FloatToInt8TypeConvertComputer.java @@ -23,10 +23,10 @@ import java.io.IOException; import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.common.exceptions.RuntimeDataException; -import org.apache.asterix.om.base.AFloat; import org.apache.asterix.om.base.AInt8; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.FloatPointable; @@ -55,8 +55,9 @@ public class FloatToInt8TypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { - float sourceValue = ((AFloat) sourceObject).getFloatValue(); + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { + float sourceValue = ATypeHierarchy.applyMathFunctionToFloatValue(sourceObject, mathFunction); byte targetValue = convert(sourceValue); return new AInt8(targetValue); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ITypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ITypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ITypeConvertComputer.java index a13878d..625a52c 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ITypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/ITypeConvertComputer.java @@ -22,6 +22,7 @@ import java.io.DataOutput; import java.io.IOException; import org.apache.asterix.om.base.IAObject; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; public interface ITypeConvertComputer { @@ -30,5 +31,6 @@ public interface ITypeConvertComputer { void convertType(byte[] data, int start, int length, DataOutput out) throws IOException; // promote or demote a type to a different type - IAObject convertType(IAObject sourceObject) throws HyracksDataException; + // mathFunction (e.g., ceil or floor) is used to convert a real value into an integer value. + IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) throws HyracksDataException; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToDoubleTypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToDoubleTypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToDoubleTypeConvertComputer.java index 55bba87..f0da652 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToDoubleTypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToDoubleTypeConvertComputer.java @@ -31,6 +31,7 @@ import org.apache.asterix.om.base.AInt64; import org.apache.asterix.om.base.AInt8; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.BytePointable; import org.apache.hyracks.data.std.primitive.IntegerPointable; @@ -73,7 +74,8 @@ public class IntegerToDoubleTypeConvertComputer implements ITypeConvertComputer } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { long val; switch (sourceObject.getType().getTypeTag()) { case TINYINT: http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToFloatTypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToFloatTypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToFloatTypeConvertComputer.java index 4aa4749..5ca3a51 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToFloatTypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToFloatTypeConvertComputer.java @@ -31,6 +31,7 @@ import org.apache.asterix.om.base.AInt64; import org.apache.asterix.om.base.AInt8; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.BytePointable; import org.apache.hyracks.data.std.primitive.IntegerPointable; @@ -75,7 +76,8 @@ public class IntegerToFloatTypeConvertComputer implements ITypeConvertComputer { } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { float val; switch (sourceObject.getType().getTypeTag()) { case TINYINT: http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt16TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt16TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt16TypeConvertComputer.java index 86363fc..f3dbb59 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt16TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt16TypeConvertComputer.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; public class IntegerToInt16TypeConvertComputer extends AbstractIntegerTypeConvertComputer { @@ -46,7 +47,8 @@ public class IntegerToInt16TypeConvertComputer extends AbstractIntegerTypeConver } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { return convertIntegerType(sourceObject, ATypeTag.SMALLINT); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt32TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt32TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt32TypeConvertComputer.java index 73f16fa..3ebf240 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt32TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt32TypeConvertComputer.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; public class IntegerToInt32TypeConvertComputer extends AbstractIntegerTypeConvertComputer { @@ -46,7 +47,8 @@ public class IntegerToInt32TypeConvertComputer extends AbstractIntegerTypeConver } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { return convertIntegerType(sourceObject, ATypeTag.INTEGER); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt64TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt64TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt64TypeConvertComputer.java index bfe1625..a3cfa99 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt64TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt64TypeConvertComputer.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; public class IntegerToInt64TypeConvertComputer extends AbstractIntegerTypeConvertComputer { @@ -43,7 +44,8 @@ public class IntegerToInt64TypeConvertComputer extends AbstractIntegerTypeConver } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { return convertIntegerType(sourceObject, ATypeTag.BIGINT); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt8TypeConvertComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt8TypeConvertComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt8TypeConvertComputer.java index 32e3d00..61684d6 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt8TypeConvertComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/hierachy/IntegerToInt8TypeConvertComputer.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.asterix.om.base.IAObject; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy.TypeCastingMathFunctionType; import org.apache.hyracks.api.exceptions.HyracksDataException; public class IntegerToInt8TypeConvertComputer extends AbstractIntegerTypeConvertComputer { @@ -45,7 +46,8 @@ public class IntegerToInt8TypeConvertComputer extends AbstractIntegerTypeConvert } @Override - public IAObject convertType(IAObject sourceObject) throws HyracksDataException { + public IAObject convertType(IAObject sourceObject, TypeCastingMathFunctionType mathFunction) + throws HyracksDataException { return convertIntegerType(sourceObject, ATypeTag.TINYINT); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstanctSearchOperationCallbackFactory.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstanctSearchOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstanctSearchOperationCallbackFactory.java new file mode 100644 index 0000000..ec6fdbe --- /dev/null +++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstanctSearchOperationCallbackFactory.java @@ -0,0 +1,68 @@ +/* + * 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.transaction.management.opcallbacks; + +import org.apache.asterix.common.api.IJobEventListenerFactory; +import org.apache.asterix.common.context.ITransactionSubsystemProvider; +import org.apache.asterix.common.exceptions.ACIDException; +import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory; +import org.apache.asterix.common.transactions.DatasetId; +import org.apache.asterix.common.transactions.ITransactionContext; +import org.apache.asterix.common.transactions.ITransactionSubsystem; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.dataflow.IOperatorNodePushable; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.api.job.IJobletEventListenerFactory; +import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory; +import org.apache.hyracks.storage.common.ISearchOperationCallback; + +/** + * Instant-search-operation-callback class for the index-only plan. The purpose of this callback is executing an instant + * tryLock on PK during a secondary index-search. + * + */ +public class SecondaryIndexInstanctSearchOperationCallbackFactory extends AbstractOperationCallbackFactory + implements ISearchOperationCallbackFactory { + + private static final long serialVersionUID = 1L; + + public SecondaryIndexInstanctSearchOperationCallbackFactory(int datasetId, int[] entityIdFields, + ITransactionSubsystemProvider txnSubsystemProvider, byte resourceType) { + super(datasetId, entityIdFields, txnSubsystemProvider, resourceType); + } + + @Override + public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, + IOperatorNodePushable operatorNodePushable) throws HyracksDataException { + try { + // If the plan is an index-only query plan, we need to try to get an instant try lock on PK. + // If an instant tryLock on PK fails, we do not attempt to do a lock since the operations + // will be dealt with in the operators after the given secondary-index search. + ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx); + IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory(); + ITransactionContext txnCtx = txnSubsystem.getTransactionManager() + .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId)); + return new SecondaryIndexInstantSearchOperationCallback(new DatasetId(datasetId), resourceId, + primaryKeyFields, txnSubsystem.getLockManager(), txnCtx); + } catch (ACIDException e) { + throw new HyracksDataException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstantSearchOperationCallback.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstantSearchOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstantSearchOperationCallback.java new file mode 100644 index 0000000..2f2a1c5 --- /dev/null +++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexInstantSearchOperationCallback.java @@ -0,0 +1,72 @@ +/* + * Copyright 2009-2013 by The Regents of the University of California + * Licensed 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 from + * + * 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.transaction.management.opcallbacks; + +import org.apache.asterix.common.exceptions.ACIDException; +import org.apache.asterix.common.transactions.AbstractOperationCallback; +import org.apache.asterix.common.transactions.DatasetId; +import org.apache.asterix.common.transactions.ILockManager; +import org.apache.asterix.common.transactions.ITransactionContext; +import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode; +import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference; +import org.apache.hyracks.storage.common.ISearchOperationCallback; + +/** + * Assumes LSM-BTrees as primary indexes. Implements try/locking and unlocking on primary keys. + * This Callback method tries to get a lock on PK (instantTryLock). + * If it fails, this callback does nothing since its purpose is to attempt to get an instant lock + * and get the result of it. This operation callback is used in an index-only plan. + */ +public class SecondaryIndexInstantSearchOperationCallback extends AbstractOperationCallback + implements ISearchOperationCallback { + + public SecondaryIndexInstantSearchOperationCallback(DatasetId datasetId, long resourceId, int[] entityIdFields, + ILockManager lockManager, ITransactionContext txnCtx) { + super(datasetId, resourceId, entityIdFields, txnCtx, lockManager); + } + + @Override + public void before(ITupleReference tuple) throws HyracksDataException { + // This will not be used for a modification operation. + } + + @Override + public boolean proceed(ITupleReference tuple) throws HyracksDataException { + int pkHash = computePrimaryKeyHashValue(tuple, primaryKeyFields); + try { + return lockManager.instantTryLock(datasetId, pkHash, LockMode.S, txnCtx); + } catch (ACIDException e) { + throw new HyracksDataException(e); + } + } + + @Override + public void reconcile(ITupleReference tuple) throws HyracksDataException { + // No reconciled required since the purpose is instantTryLock on PK. + } + + @Override + public void cancel(ITupleReference tuple) throws HyracksDataException { + // No cancel required since reconcile operation is empty. + } + + @Override + public void complete(ITupleReference tuple) throws HyracksDataException { + // No cancel required since reconcile operation is empty. + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java b/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java new file mode 100644 index 0000000..6e393bb --- /dev/null +++ b/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/utils/Quadruple.java @@ -0,0 +1,84 @@ +/* + * Copyright 2009-2013 by The Regents of the University of California + * Licensed 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 from + * + * 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.hyracks.algebricks.common.utils; + +import java.util.Objects; + +public class Quadruple<T1, T2, T3, T4> { + private T1 first; + private T2 second; + private T3 third; + private T4 fourth; + + public Quadruple(T1 first, T2 second, T3 third, T4 fourth) { + this.first = first; + this.second = second; + this.third = third; + this.fourth = fourth; + } + + public void setFirst(T1 first) { + this.first = first; + } + + public void setSecond(T2 second) { + this.second = second; + } + + public void setThird(T3 third) { + this.third = third; + } + + public void setFourth(T4 fourth) { + this.fourth = fourth; + } + + public T1 getFirst() { + return this.first; + } + + public T2 getSecond() { + return this.second; + } + + public T3 getThird() { + return this.third; + } + + public T4 getFourth() { + return this.fourth; + } + + @Override + public String toString() { + return first + "," + second + ", " + third + ", " + fourth; + } + + @Override + public int hashCode() { + return Objects.hash(first, second, third, fourth); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Quadruple<?, ?, ?, ?>)) { + return false; + } + Quadruple<?, ?, ?, ?> quadruple = (Quadruple<?, ?, ?, ?>) o; + return Objects.equals(first, quadruple.first) && Objects.equals(second, quadruple.second) + && Objects.equals(third, quadruple.third) && Objects.equals(fourth, quadruple.fourth); + } + +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractUnnestMapOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractUnnestMapOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractUnnestMapOperator.java index a8e6b44..c2d2cfa 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractUnnestMapOperator.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractUnnestMapOperator.java @@ -36,6 +36,8 @@ public abstract class AbstractUnnestMapOperator extends AbstractUnnestOperator { protected List<LogicalVariable> maxFilterVars; protected boolean propagateIndexFilter; + // Used when the result of a searchCallBack.proceed() is required afterwards. + protected boolean generateSearchCallBackProceedResultVar; public AbstractUnnestMapOperator(List<LogicalVariable> variables, Mutable<ILogicalExpression> expression, List<Object> variableTypes, boolean propagateInput) { @@ -44,15 +46,20 @@ public abstract class AbstractUnnestMapOperator extends AbstractUnnestOperator { this.variableTypes = variableTypes; this.propagateInput = propagateInput; this.propagateIndexFilter = false; + this.generateSearchCallBackProceedResultVar = false; } @Override public List<LogicalVariable> getScanVariables() { + // An additional variable - generateSearchCallBackProceedResultVar should not be returned. + int excludeVarCount = 0; if (propagateIndexFilter) { - return variables.subList(0, variables.size() - 2); - } else { - return variables; + excludeVarCount += 2; + } + if (generateSearchCallBackProceedResultVar) { + excludeVarCount++; } + return excludeVarCount > 0 ? variables.subList(0, variables.size() - excludeVarCount) : variables; } public List<Object> getVariableTypes() { @@ -133,4 +140,18 @@ public abstract class AbstractUnnestMapOperator extends AbstractUnnestOperator { return null; } } + + /** + * Sets the variable to tell whether the result of a searchCallBack.proceed() is required. + * If this variable is set to true, the last variable in the variables list should contain + * the result of a searchCallBack.proceed(). + */ + public void setGenerateCallBackProceedResultVar(boolean generateCallBackProceedResultVar) { + this.generateSearchCallBackProceedResultVar = generateCallBackProceedResultVar; + } + + public boolean getGenerateCallBackProceedResultVar() { + return this.generateSearchCallBackProceedResultVar; + } + } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterUnnestMapOperator.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterUnnestMapOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterUnnestMapOperator.java index a17e2a0..817eeaf 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterUnnestMapOperator.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterUnnestMapOperator.java @@ -18,6 +18,7 @@ */ package org.apache.hyracks.algebricks.core.algebra.operators.logical; +import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.mutable.Mutable; @@ -60,7 +61,7 @@ public class LeftOuterUnnestMapOperator extends AbstractUnnestMapOperator { // Propagates all input variables that come from the outer branch. PropagatingTypeEnvironment env = createPropagatingAllInputsTypeEnvironment(ctx); - env.getCorrelatedMissableVariableLists().add(variables); + env.getCorrelatedMissableVariableLists().add(new ArrayList<>(variables)); // For the variables from the inner branch, the output type is the union // of (original type + null). http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java index 0ad3fea..70f19c1 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java @@ -369,7 +369,7 @@ public class LogicalOperatorPrettyPrintVisitor extends AbstractLogicalOperatorPr @Override public Void visitSplitOperator(SplitOperator op, Integer indent) throws AlgebricksException { Mutable<ILogicalExpression> branchingExpression = op.getBranchingExpression(); - addIndent(indent).append("split " + branchingExpression.getValue().accept(exprVisitor, indent)); + addIndent(indent).append("split (" + branchingExpression.getValue().accept(exprVisitor, indent) + ")"); return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java index 4283198..1076eb5 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java @@ -524,7 +524,8 @@ public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperat public Void visitSplitOperator(SplitOperator op, Integer indent) throws AlgebricksException { Mutable<ILogicalExpression> branchingExpression = op.getBranchingExpression(); addIndent(indent).append("\"operator\": \"split\",\n"); - addIndent(indent).append("\"" + branchingExpression.getValue().accept(exprVisitor, indent) + "\""); + addIndent(indent).append("\"expressions\": \"" + + branchingExpression.getValue().accept(exprVisitor, indent).replace('"', ' ') + "\""); return null; } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java index e0d806d..a5cd5fa 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java @@ -59,9 +59,15 @@ public class OperatorPropertiesUtil { return true; } - // Obs: doesn't return expected result for op. with nested plans. - private static void getFreeVariablesInOp(ILogicalOperator op, Set<LogicalVariable> freeVars) + /** + * Adds the free variables of the operator to the given set. + * + * @param op + * @param freeVars + */ + public static void getFreeVariablesInOp(ILogicalOperator op, Set<LogicalVariable> freeVars) throws AlgebricksException { + // Obs: doesn't return expected result for op. with nested plans. VariableUtilities.getUsedVariables(op, freeVars); HashSet<LogicalVariable> produced = new HashSet<>(); VariableUtilities.getProducedVariables(op, produced); @@ -248,6 +254,16 @@ public class OperatorPropertiesUtil { } } + /** + * Recursively visits all descendants of the given operator and + * (re)computes and sets a type environment for each operator. + * + * @param r + * a mutable logical operator + * @param context + * optimization context + * @throws AlgebricksException + */ public static void typeOpRec(Mutable<ILogicalOperator> r, IOptimizationContext context) throws AlgebricksException { AbstractLogicalOperator op = (AbstractLogicalOperator) r.getValue(); for (Mutable<ILogicalOperator> i : op.getInputs()) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java index 923ffb5..4c2d910 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java @@ -37,6 +37,7 @@ import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractReplicateOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; @@ -466,7 +467,7 @@ public class ExtractCommonOperatorsRule implements IAlgebraicRewriteRule { int outputIndex = 0; if (opRef.getValue().getOperatorTag() == LogicalOperatorTag.REPLICATE || opRef.getValue().getOperatorTag() == LogicalOperatorTag.SPLIT) { - ReplicateOperator rop = (ReplicateOperator) opRef.getValue(); + AbstractReplicateOperator rop = (AbstractReplicateOperator) opRef.getValue(); List<Mutable<ILogicalOperator>> outputs = rop.getOutputs(); for (outputIndex = 0; outputIndex < outputs.size(); outputIndex++) { if (outputs.get(outputIndex).equals(parentRef)) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java index 44a7b57..a724014 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroduceProjectsRule.java @@ -29,14 +29,12 @@ import java.util.Set; import org.apache.commons.lang3.mutable.Mutable; import org.apache.commons.lang3.mutable.MutableObject; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; -import org.apache.hyracks.algebricks.common.utils.Triple; import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext; import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule; @@ -177,16 +175,8 @@ public class IntroduceProjectsRule implements IAlgebraicRewriteRule { ProjectOperator projectOp = (ProjectOperator) op; List<LogicalVariable> projectVarsTemp = projectOp.getVariables(); if (liveVars.size() == projectVarsTemp.size() && liveVars.containsAll(projectVarsTemp)) { - boolean eliminateProject = true; - // For UnionAll the variables must also be in exactly the correct order. - if (parentOp.getOperatorTag() == LogicalOperatorTag.UNIONALL) { - eliminateProject = - canEliminateProjectBelowUnion((UnionAllOperator) parentOp, projectOp, parentInputIndex); - } - if (eliminateProject) { - // The existing project has become useless. Remove it. - parentOp.getInputs().get(parentInputIndex).setValue(op.getInputs().get(0).getValue()); - } + // The existing project has become useless. Remove it. + parentOp.getInputs().get(parentInputIndex).setValue(op.getInputs().get(0).getValue()); } } @@ -196,23 +186,4 @@ public class IntroduceProjectsRule implements IAlgebraicRewriteRule { return modified; } - private boolean canEliminateProjectBelowUnion(UnionAllOperator unionOp, ProjectOperator projectOp, - int unionInputIndex) throws AlgebricksException { - List<LogicalVariable> orderedLiveVars = new ArrayList<>(); - VariableUtilities.getLiveVariables(projectOp.getInputs().get(0).getValue(), orderedLiveVars); - int numVars = orderedLiveVars.size(); - for (int i = 0; i < numVars; i++) { - Triple<LogicalVariable, LogicalVariable, LogicalVariable> varTriple = unionOp.getVariableMappings().get(i); - if (unionInputIndex == 0) { - if (varTriple.first != orderedLiveVars.get(i)) { - return false; - } - } else { - if (varTriple.second != orderedLiveVars.get(i)) { - return false; - } - } - } - return true; - } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java index e197814..062bb2f 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java @@ -146,12 +146,15 @@ public class RemoveUnusedAssignAndAggregateRule implements IAlgebraicRewriteRule Set<LogicalVariable> assignVarsSetForThisOp = removeAssignVarFromConsideration(opRef); while (removeFromAssigns(op, assignVarsSetForThisOp, context) == 0) { - if (op.getOperatorTag() == LogicalOperatorTag.AGGREGATE) { + // UnionAllOperator cannot be removed since it has two branches. + if (op.getOperatorTag() == LogicalOperatorTag.AGGREGATE + || op.getOperatorTag() == LogicalOperatorTag.UNIONALL) { break; } op = (AbstractLogicalOperator) op.getInputs().get(0).getValue(); opRef.setValue(op); assignVarsSetForThisOp = removeAssignVarFromConsideration(opRef); + isTransformed = true; } Iterator<Mutable<ILogicalOperator>> childIter = op.getInputs().iterator(); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java index 8b47171..ad2d6f9 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java @@ -140,6 +140,8 @@ public class ErrorCode { public static final int INDEX_DOES_NOT_EXIST = 104; public static final int CANNOT_DROP_IN_USE_INDEX = 105; public static final int CANNOT_DEACTIVATE_PINNED_BLOOM_FILTER = 106; + public static final int PREDICATE_CANNOT_BE_NULL = 107; + public static final int FULLTEXT_ONLY_EXECUTABLE_FOR_STRING_OR_LIST = 108; // Compilation error codes. public static final int RULECOLLECTION_NOT_INSTANCE_OF_LIST = 10000; http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties index a27a736..c3945a3 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties @@ -123,5 +123,7 @@ 104 = Index does not exist 105 = Cannot drop in-use index (%1$s) 106 = Failed to deactivate the bloom filter since it is pinned by other users +107 = The given search predicate can't be null. +108 = Full-text search can be only executed on STRING or (UN)ORDERED LIST. 10000 = The given rule collection %1$s is not an instance of the List class. http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c3c23574/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java index 02bb20e..49eca6f 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeSearchOperatorDescriptor.java @@ -37,20 +37,35 @@ public class BTreeSearchOperatorDescriptor extends AbstractSingleActivityOperato protected final int[] highKeyFields; protected final boolean lowKeyInclusive; protected final boolean highKeyInclusive; - protected final int[] minFilterFieldIndexes; - protected final int[] maxFilterFieldIndexes; + private final int[] minFilterFieldIndexes; + private final int[] maxFilterFieldIndexes; protected final IIndexDataflowHelperFactory indexHelperFactory; protected final boolean retainInput; protected final boolean retainMissing; protected final IMissingWriterFactory missingWriterFactory; protected final ISearchOperationCallbackFactory searchCallbackFactory; protected final boolean appendIndexFilter; + protected boolean appendOpCallbackProceedResult; + protected byte[] searchCallbackProceedResultFalseValue; + protected byte[] searchCallbackProceedResultTrueValue; public BTreeSearchOperatorDescriptor(IOperatorDescriptorRegistry spec, RecordDescriptor outRecDesc, int[] lowKeyFields, int[] highKeyFields, boolean lowKeyInclusive, boolean highKeyInclusive, IIndexDataflowHelperFactory indexHelperFactory, boolean retainInput, boolean retainMissing, IMissingWriterFactory missingWriterFactory, ISearchOperationCallbackFactory searchCallbackFactory, int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes, boolean appendIndexFilter) { + this(spec, outRecDesc, lowKeyFields, highKeyFields, lowKeyInclusive, highKeyInclusive, indexHelperFactory, + retainInput, retainMissing, missingWriterFactory, searchCallbackFactory, minFilterFieldIndexes, + maxFilterFieldIndexes, appendIndexFilter, false, null, null); + } + + public BTreeSearchOperatorDescriptor(IOperatorDescriptorRegistry spec, RecordDescriptor outRecDesc, + int[] lowKeyFields, int[] highKeyFields, boolean lowKeyInclusive, boolean highKeyInclusive, + IIndexDataflowHelperFactory indexHelperFactory, boolean retainInput, boolean retainMissing, + IMissingWriterFactory missingWriterFactory, ISearchOperationCallbackFactory searchCallbackFactory, + int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes, boolean appendIndexFilter, + boolean appendOpCallbackProceedResult, byte[] searchCallbackProceedResultFalseValue, + byte[] searchCallbackProceedResultTrueValue) { super(spec, 1, 1); this.indexHelperFactory = indexHelperFactory; this.retainInput = retainInput; @@ -65,6 +80,9 @@ public class BTreeSearchOperatorDescriptor extends AbstractSingleActivityOperato this.maxFilterFieldIndexes = maxFilterFieldIndexes; this.appendIndexFilter = appendIndexFilter; this.outRecDescs[0] = outRecDesc; + this.appendOpCallbackProceedResult = appendOpCallbackProceedResult; + this.searchCallbackProceedResultFalseValue = searchCallbackProceedResultFalseValue; + this.searchCallbackProceedResultTrueValue = searchCallbackProceedResultTrueValue; } @Override @@ -73,6 +91,9 @@ public class BTreeSearchOperatorDescriptor extends AbstractSingleActivityOperato return new BTreeSearchOperatorNodePushable(ctx, partition, recordDescProvider.getInputRecordDescriptor(getActivityId(), 0), lowKeyFields, highKeyFields, lowKeyInclusive, highKeyInclusive, minFilterFieldIndexes, maxFilterFieldIndexes, indexHelperFactory, - retainInput, retainMissing, missingWriterFactory, searchCallbackFactory, appendIndexFilter); + retainInput, retainMissing, missingWriterFactory, searchCallbackFactory, appendIndexFilter, + appendOpCallbackProceedResult, searchCallbackProceedResultFalseValue, + searchCallbackProceedResultTrueValue); } + }