You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by wa...@apache.org on 2018/02/16 19:04:08 UTC
[02/16] asterixdb git commit: [ASTERIXDB-1972][COMP][RT][TX]
index-only plan
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);
}
+
}