Repository: asterixdb Updated Branches: refs/heads/master a57e15466 -> 8076fe97d
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8076fe97/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java index 28c612f..d4b54f8 100644 --- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java +++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java @@ -19,7 +19,6 @@ package org.apache.asterix.metadata.utils; import java.io.DataOutput; -import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -41,6 +40,7 @@ import org.apache.asterix.external.indexing.IndexingConstants; import org.apache.asterix.formats.base.IDataFormat; import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider; import org.apache.asterix.formats.nontagged.TypeTraitProvider; +import org.apache.asterix.metadata.IDatasetDetails; import org.apache.asterix.metadata.MetadataManager; import org.apache.asterix.metadata.MetadataTransactionContext; import org.apache.asterix.metadata.declared.MetadataProvider; @@ -137,7 +137,7 @@ public class DatasetUtil { return typeTraits; } - public static int[] createFilterFields(Dataset dataset) throws AlgebricksException { + public static int[] createFilterFields(Dataset dataset) { if (dataset.getDatasetType() == DatasetType.EXTERNAL) { return null; } @@ -154,7 +154,7 @@ public class DatasetUtil { return filterFields; } - public static int[] createBTreeFieldsWhenThereisAFilter(Dataset dataset) throws AlgebricksException { + public static int[] createBTreeFieldsWhenThereisAFilter(Dataset dataset) { if (dataset.getDatasetType() == DatasetType.EXTERNAL) { return null; } @@ -173,17 +173,41 @@ public class DatasetUtil { return btreeFields; } - public static int getPositionOfPartitioningKeyField(Dataset dataset, List<String> fieldExpr) { + public static int getPositionOfPartitioningKeyField(Dataset dataset, List<String> fieldExpr, + boolean fieldFromMeta) { + List<Integer> keySourceIndicator = null; + IDatasetDetails datasetDetails = dataset.getDatasetDetails(); + if (datasetDetails.getDatasetType() == DatasetType.INTERNAL) { + keySourceIndicator = ((InternalDatasetDetails) datasetDetails).getKeySourceIndicator(); + } List<List<String>> partitioningKeys = dataset.getPrimaryKeys(); for (int i = 0; i < partitioningKeys.size(); i++) { List<String> partitioningKey = partitioningKeys.get(i); - if (partitioningKey.equals(fieldExpr)) { + if (partitioningKey.equals(fieldExpr) && keySourceMatches(keySourceIndicator, i, fieldFromMeta)) { return i; } } return -1; } + /** + * Once it's determined that a field name is a key (by just comparing the names), this method checks whether the + * field is actually a key by making sure the field is coming from the right record (data record or meta record), + * e.g. if the field name happens to be equal to the key name but the field is coming from the data record while + * the key is coming from the meta record. + * @param keySourceIndicator indicates where the key is coming from, 1 from meta record, 0 from data record + * @param keyIndex the key index we're checking the field against + * @param fieldFromMeta whether the field is coming from the meta record or the data record + * @return true if the key source matches the field source. Otherwise, false. + */ + private static boolean keySourceMatches(List<Integer> keySourceIndicator, int keyIndex, boolean fieldFromMeta) { + if (keySourceIndicator != null) { + return (fieldFromMeta && keySourceIndicator.get(keyIndex) == 1) + || (!fieldFromMeta && keySourceIndicator.get(keyIndex) == 0); + } + return true; + } + public static Pair<ILSMMergePolicyFactory, Map<String, String>> getMergePolicyFactory(Dataset dataset, MetadataTransactionContext mdTxnCtx) throws AlgebricksException { String policyName = dataset.getCompactionPolicy(); @@ -238,7 +262,7 @@ public class DatasetUtil { } public static JobSpecification dropDatasetJobSpec(Dataset dataset, MetadataProvider metadataProvider) - throws AlgebricksException, HyracksDataException, RemoteException, ACIDException { + throws AlgebricksException, ACIDException { LOGGER.info("DROP DATASET: " + dataset); if (dataset.getDatasetType() == DatasetType.EXTERNAL) { return RuntimeUtils.createJobSpecification(metadataProvider.getApplicationContext());
