http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/executor/util/QueryUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/executor/util/QueryUtil.java b/core/src/main/java/org/apache/carbondata/scan/executor/util/QueryUtil.java deleted file mode 100644 index 4f0789f..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/executor/util/QueryUtil.java +++ /dev/null @@ -1,882 +0,0 @@ -/* - * 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.carbondata.scan.executor.util; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeSet; - -import org.apache.carbondata.core.cache.Cache; -import org.apache.carbondata.core.cache.CacheProvider; -import org.apache.carbondata.core.cache.CacheType; -import org.apache.carbondata.core.cache.dictionary.Dictionary; -import org.apache.carbondata.core.cache.dictionary.DictionaryColumnUniqueIdentifier; -import org.apache.carbondata.core.AbsoluteTableIdentifier; -import org.apache.carbondata.core.CarbonTableIdentifier; -import org.apache.carbondata.core.datastore.block.SegmentProperties; -import org.apache.carbondata.core.metadata.CarbonMetadata; -import org.apache.carbondata.core.metadata.DataType; -import org.apache.carbondata.core.metadata.Encoding; -import org.apache.carbondata.core.metadata.schema.table.CarbonTable; -import org.apache.carbondata.core.metadata.schema.table.column.CarbonDimension; -import org.apache.carbondata.core.metadata.schema.table.column.CarbonMeasure; -import org.apache.carbondata.core.constants.CarbonCommonConstants; -import org.apache.carbondata.core.keygenerator.KeyGenException; -import org.apache.carbondata.core.keygenerator.KeyGenerator; -import org.apache.carbondata.core.util.CarbonUtil; -import org.apache.carbondata.scan.complextypes.ArrayQueryType; -import org.apache.carbondata.scan.complextypes.PrimitiveQueryType; -import org.apache.carbondata.scan.complextypes.StructQueryType; -import org.apache.carbondata.scan.executor.infos.KeyStructureInfo; -import org.apache.carbondata.scan.expression.ColumnExpression; -import org.apache.carbondata.scan.expression.Expression; -import org.apache.carbondata.scan.filter.GenericQueryType; -import org.apache.carbondata.scan.filter.resolver.FilterResolverIntf; -import org.apache.carbondata.scan.filter.resolver.resolverinfo.DimColumnResolvedFilterInfo; -import org.apache.carbondata.scan.model.QueryDimension; -import org.apache.carbondata.scan.model.QueryMeasure; -import org.apache.carbondata.scan.model.QueryModel; - -import org.apache.commons.lang3.ArrayUtils; - -/** - * Utility class for query execution - */ -public class QueryUtil { - - /** - * Below method will be used to get the masked byte range based on the query - * dimension. It will give the range in the mdkey. This will be used to get - * the actual key array from masked mdkey - * - * @param queryDimensions query dimension selected in query - * @param keyGenerator key generator - * @return masked key - */ - public static int[] getMaskedByteRange(List<QueryDimension> queryDimensions, - KeyGenerator keyGenerator) { - Set<Integer> byteRangeSet = new TreeSet<Integer>(); - int[] byteRange = null; - for (int i = 0; i < queryDimensions.size(); i++) { - - // as no dictionary column and complex type columns - // are not selected in the mdkey - // so we will not select the those dimension for calculating the - // range - if (queryDimensions.get(i).getDimension().getKeyOrdinal() == -1) { - continue; - } - // get the offset of the dimension in the mdkey - byteRange = - keyGenerator.getKeyByteOffsets(queryDimensions.get(i).getDimension().getKeyOrdinal()); - for (int j = byteRange[0]; j <= byteRange[1]; j++) { - byteRangeSet.add(j); - } - } - int[] maksedByteRange = new int[byteRangeSet.size()]; - int index = 0; - Iterator<Integer> iterator = byteRangeSet.iterator(); - // add the masked byte range - while (iterator.hasNext()) { - maksedByteRange[index++] = iterator.next(); - } - return maksedByteRange; - } - - public static int[] getMaskedByteRangeBasedOrdinal(List<Integer> ordinals, - KeyGenerator keyGenerator) { - Set<Integer> byteRangeSet = new TreeSet<Integer>(); - int[] byteRange = null; - for (int i = 0; i < ordinals.size(); i++) { - - // get the offset of the dimension in the mdkey - byteRange = keyGenerator.getKeyByteOffsets(ordinals.get(i)); - for (int j = byteRange[0]; j <= byteRange[1]; j++) { - byteRangeSet.add(j); - } - } - int[] maksedByteRange = new int[byteRangeSet.size()]; - int index = 0; - Iterator<Integer> iterator = byteRangeSet.iterator(); - // add the masked byte range - while (iterator.hasNext()) { - maksedByteRange[index++] = iterator.next(); - } - return maksedByteRange; - } - - /** - * Below method will return the max key based on the dimension ordinal - * - * @param keyOrdinalList - * @param generator - * @return - * @throws KeyGenException - */ - public static byte[] getMaxKeyBasedOnOrinal(List<Integer> keyOrdinalList, KeyGenerator generator) - throws KeyGenException { - long[] max = new long[generator.getDimCount()]; - Arrays.fill(max, 0L); - - for (int i = 0; i < keyOrdinalList.size(); i++) { - // adding for dimension which is selected in query - max[keyOrdinalList.get(i)] = Long.MAX_VALUE; - } - return generator.generateKey(max); - } - - /** - * To get the max key based on dimensions. i.e. all other dimensions will be - * set to 0 bits and the required query dimension will be masked with all - * LONG.MAX so that we can mask key and then compare while aggregating This - * can be useful during filter query when only few dimensions were selected - * out of row group - * - * @param queryDimensions dimension selected in query - * @param generator key generator - * @return max key for dimension - * @throws KeyGenException if any problem while generating the key - */ - public static byte[] getMaxKeyBasedOnDimensions(List<QueryDimension> queryDimensions, - KeyGenerator generator) throws KeyGenException { - long[] max = new long[generator.getDimCount()]; - Arrays.fill(max, 0L); - - for (int i = 0; i < queryDimensions.size(); i++) { - // as no dictionary column and complex type columns - // are not selected in the mdkey - // so we will not select the those dimension for calculating the - // range - if (queryDimensions.get(i).getDimension().getKeyOrdinal() == -1) { - continue; - } - // adding for dimension which is selected in query - max[queryDimensions.get(i).getDimension().getKeyOrdinal()] = Long.MAX_VALUE; - } - - return generator.generateKey(max); - } - - /** - * Below method will be used to get the masked key for query - * - * @param keySize size of the masked key - * @param maskedKeyRanges masked byte range - * @return masked bytes - */ - public static int[] getMaskedByte(int keySize, int[] maskedKeyRanges) { - int[] maskedKey = new int[keySize]; - // all the non selected dimension will be filled with -1 - Arrays.fill(maskedKey, -1); - for (int i = 0; i < maskedKeyRanges.length; i++) { - maskedKey[maskedKeyRanges[i]] = i; - } - return maskedKey; - } - - /** - * Below method will be used to get the dimension block index in file based - * on query dimension - * - * @param queryDimensions query dimension - * @param dimensionOrdinalToBlockMapping mapping of dimension block in file to query dimension - * @return block index of file - */ - public static int[] getDimensionsBlockIndexes(List<QueryDimension> queryDimensions, - Map<Integer, Integer> dimensionOrdinalToBlockMapping, - List<CarbonDimension> customAggregationDimension, Set<CarbonDimension> filterDimensions, - List<Integer> allProjectionListDimensionIndexes) { - // using set as in row group columns will point to same block - Set<Integer> dimensionBlockIndex = new HashSet<Integer>(); - Set<Integer> filterDimensionOrdinal = getFilterDimensionOrdinal(filterDimensions); - int blockIndex = 0; - for (int i = 0; i < queryDimensions.size(); i++) { - if (queryDimensions.get(i).getDimension().hasEncoding(Encoding.IMPLICIT)) { - continue; - } - allProjectionListDimensionIndexes.add(queryDimensions.get(i).getDimension().getOrdinal()); - - if (!filterDimensionOrdinal.contains(queryDimensions.get(i).getDimension().getOrdinal())) { - blockIndex = - dimensionOrdinalToBlockMapping.get(queryDimensions.get(i).getDimension().getOrdinal()); - dimensionBlockIndex.add(blockIndex); - if (queryDimensions.get(i).getDimension().numberOfChild() > 0) { - addChildrenBlockIndex(dimensionBlockIndex, queryDimensions.get(i).getDimension()); - } - } - } - for (int i = 0; i < customAggregationDimension.size(); i++) { - blockIndex = - dimensionOrdinalToBlockMapping.get(customAggregationDimension.get(i).getOrdinal()); - // not adding the children dimension as dimension aggregation - // is not push down in case of complex dimension - dimensionBlockIndex.add(blockIndex); - } - int[] dimensionIndex = ArrayUtils - .toPrimitive(dimensionBlockIndex.toArray(new Integer[dimensionBlockIndex.size()])); - Arrays.sort(dimensionIndex); - return dimensionIndex; - } - - /** - * Below method will be used to add the children block index - * this will be basically for complex dimension which will have children - * - * @param blockIndexes block indexes - * @param dimension parent dimension - */ - private static void addChildrenBlockIndex(Set<Integer> blockIndexes, CarbonDimension dimension) { - for (int i = 0; i < dimension.numberOfChild(); i++) { - addChildrenBlockIndex(blockIndexes, dimension.getListOfChildDimensions().get(i)); - blockIndexes.add(dimension.getListOfChildDimensions().get(i).getOrdinal()); - } - } - - /** - * Below method will be used to get the dictionary mapping for all the - * dictionary encoded dimension present in the query - * - * @param queryDimensions query dimension present in the query this will be used to - * convert the result from surrogate key to actual data - * @param absoluteTableIdentifier absolute table identifier - * @return dimension unique id to its dictionary map - * @throws IOException - */ - public static Map<String, Dictionary> getDimensionDictionaryDetail( - List<QueryDimension> queryDimensions, Set<CarbonDimension> filterComplexDimensions, - AbsoluteTableIdentifier absoluteTableIdentifier) throws IOException { - // to store dimension unique column id list, this is required as - // dimension can be present in - // query dimension, as well as some aggregation function will be applied - // in the same dimension - // so we need to get only one instance of dictionary - // direct dictionary skip is done only for the dictionary lookup - Set<String> dictionaryDimensionFromQuery = new HashSet<String>(); - for (int i = 0; i < queryDimensions.size(); i++) { - List<Encoding> encodingList = queryDimensions.get(i).getDimension().getEncoder(); - // TODO need to remove the data type check for parent column in complex type no need to - // write encoding dictionary - if (CarbonUtil.hasEncoding(encodingList, Encoding.DICTIONARY) && !CarbonUtil - .hasEncoding(encodingList, Encoding.DIRECT_DICTIONARY) && !CarbonUtil - .hasEncoding(encodingList, Encoding.IMPLICIT)) { - - if (queryDimensions.get(i).getDimension().numberOfChild() == 0) { - dictionaryDimensionFromQuery.add(queryDimensions.get(i).getDimension().getColumnId()); - } - if (queryDimensions.get(i).getDimension().numberOfChild() > 0) { - getChildDimensionDictionaryDetail(queryDimensions.get(i).getDimension(), - dictionaryDimensionFromQuery); - } - } - } - Iterator<CarbonDimension> iterator = filterComplexDimensions.iterator(); - while (iterator.hasNext()) { - getChildDimensionDictionaryDetail(iterator.next(), dictionaryDimensionFromQuery); - } - // converting to list as api exposed needed list which i think - // is not correct - List<String> dictionaryColumnIdList = - new ArrayList<String>(dictionaryDimensionFromQuery.size()); - dictionaryColumnIdList.addAll(dictionaryDimensionFromQuery); - return getDictionaryMap(dictionaryColumnIdList, absoluteTableIdentifier); - } - - /** - * Below method will be used to fill the children dimension column id - * - * @param queryDimensions query dimension - * @param dictionaryDimensionFromQuery dictionary dimension for query - */ - private static void getChildDimensionDictionaryDetail(CarbonDimension queryDimensions, - Set<String> dictionaryDimensionFromQuery) { - for (int j = 0; j < queryDimensions.numberOfChild(); j++) { - List<Encoding> encodingList = queryDimensions.getListOfChildDimensions().get(j).getEncoder(); - if (queryDimensions.getListOfChildDimensions().get(j).numberOfChild() > 0) { - getChildDimensionDictionaryDetail(queryDimensions.getListOfChildDimensions().get(j), - dictionaryDimensionFromQuery); - } else if (!CarbonUtil.hasEncoding(encodingList, Encoding.DIRECT_DICTIONARY)) { - dictionaryDimensionFromQuery - .add(queryDimensions.getListOfChildDimensions().get(j).getColumnId()); - } - } - } - - /** - * Below method will be used to get the column id to its dictionary mapping - * - * @param dictionaryColumnIdList dictionary column list - * @param absoluteTableIdentifier absolute table identifier - * @return dictionary mapping - * @throws IOException - */ - private static Map<String, Dictionary> getDictionaryMap(List<String> dictionaryColumnIdList, - AbsoluteTableIdentifier absoluteTableIdentifier) throws IOException { - // this for dictionary unique identifier - List<DictionaryColumnUniqueIdentifier> dictionaryColumnUniqueIdentifiers = - getDictionaryColumnUniqueIdentifierList(dictionaryColumnIdList, - absoluteTableIdentifier.getCarbonTableIdentifier()); - CacheProvider cacheProvider = CacheProvider.getInstance(); - Cache<DictionaryColumnUniqueIdentifier, Dictionary> forwardDictionaryCache = cacheProvider - .createCache(CacheType.FORWARD_DICTIONARY, absoluteTableIdentifier.getStorePath()); - - List<Dictionary> columnDictionaryList = - forwardDictionaryCache.getAll(dictionaryColumnUniqueIdentifiers); - Map<String, Dictionary> columnDictionaryMap = new HashMap<>(columnDictionaryList.size()); - for (int i = 0; i < dictionaryColumnUniqueIdentifiers.size(); i++) { - // TODO: null check for column dictionary, if cache size is less it - // might return null here, in that case throw exception - columnDictionaryMap.put(dictionaryColumnIdList.get(i), columnDictionaryList.get(i)); - } - return columnDictionaryMap; - } - - /** - * Below method will be used to get the dictionary column unique identifier - * - * @param dictionaryColumnIdList dictionary - * @param carbonTableIdentifier - * @return - */ - private static List<DictionaryColumnUniqueIdentifier> getDictionaryColumnUniqueIdentifierList( - List<String> dictionaryColumnIdList, CarbonTableIdentifier carbonTableIdentifier) { - CarbonTable carbonTable = - CarbonMetadata.getInstance().getCarbonTable(carbonTableIdentifier.getTableUniqueName()); - List<DictionaryColumnUniqueIdentifier> dictionaryColumnUniqueIdentifiers = - new ArrayList<>(dictionaryColumnIdList.size()); - for (String columnId : dictionaryColumnIdList) { - CarbonDimension dimension = CarbonMetadata.getInstance() - .getCarbonDimensionBasedOnColIdentifier(carbonTable, columnId); - if (dimension != null) { - dictionaryColumnUniqueIdentifiers.add( - new DictionaryColumnUniqueIdentifier( - carbonTableIdentifier, - dimension.getColumnIdentifier(), - dimension.getDataType() - ) - ); - } - } - return dictionaryColumnUniqueIdentifiers; - } - - /** - * Below method will used to get the method will be used to get the measure - * block indexes to be read from the file - * - * @param queryMeasures query measure - * @param expressionMeasure measure present in the expression - * @param ordinalToBlockIndexMapping measure ordinal to block mapping - * @return block indexes - */ - public static int[] getMeasureBlockIndexes(List<QueryMeasure> queryMeasures, - List<CarbonMeasure> expressionMeasure, Map<Integer, Integer> ordinalToBlockIndexMapping, - Set<CarbonMeasure> filterMeasures) { - Set<Integer> measureBlockIndex = new HashSet<Integer>(); - Set<Integer> filterMeasureOrdinal = getFilterMeasureOrdinal(filterMeasures); - for (int i = 0; i < queryMeasures.size(); i++) { - if (!filterMeasureOrdinal.contains(queryMeasures.get(i).getMeasure().getOrdinal())) { - measureBlockIndex - .add(ordinalToBlockIndexMapping.get(queryMeasures.get(i).getMeasure().getOrdinal())); - } - } - for (int i = 0; i < expressionMeasure.size(); i++) { - measureBlockIndex.add(ordinalToBlockIndexMapping.get(expressionMeasure.get(i).getOrdinal())); - } - int[] measureIndexes = - ArrayUtils.toPrimitive(measureBlockIndex.toArray(new Integer[measureBlockIndex.size()])); - Arrays.sort(measureIndexes); - return measureIndexes; - } - - /** - * Below method will be used to get mapping whether dimension is present in - * order by or not - * - * @param sortedDimensions sort dimension present in order by query - * @param queryDimensions query dimension - * @return sort dimension indexes - */ - public static byte[] getSortDimensionIndexes(List<QueryDimension> sortedDimensions, - List<QueryDimension> queryDimensions) { - byte[] sortedDims = new byte[queryDimensions.size()]; - int indexOf = 0; - for (int i = 0; i < sortedDims.length; i++) { - indexOf = sortedDimensions.indexOf(queryDimensions.get(i)); - if (indexOf > -1) { - sortedDims[i] = 1; - } - } - return sortedDims; - } - - /** - * Below method will be used to get the mapping of block index and its - * restructuring info - * - * @param queryDimensions query dimension from query model - * @param segmentProperties segment properties - * @return map of block index to its restructuring info - * @throws KeyGenException if problem while key generation - */ - public static Map<Integer, KeyStructureInfo> getColumnGroupKeyStructureInfo( - List<QueryDimension> queryDimensions, SegmentProperties segmentProperties) - throws KeyGenException { - Map<Integer, KeyStructureInfo> rowGroupToItsRSInfo = new HashMap<Integer, KeyStructureInfo>(); - // get column group id and its ordinal mapping of column group - Map<Integer, List<Integer>> columnGroupAndItsOrdinalMappingForQuery = - getColumnGroupAndItsOrdinalMapping(queryDimensions); - Map<Integer, KeyGenerator> columnGroupAndItsKeygenartor = - segmentProperties.getColumnGroupAndItsKeygenartor(); - - Iterator<Entry<Integer, List<Integer>>> iterator = - columnGroupAndItsOrdinalMappingForQuery.entrySet().iterator(); - KeyStructureInfo restructureInfos = null; - while (iterator.hasNext()) { - Entry<Integer, List<Integer>> next = iterator.next(); - KeyGenerator keyGenerator = columnGroupAndItsKeygenartor.get(next.getKey()); - restructureInfos = new KeyStructureInfo(); - // sort the ordinal - List<Integer> ordinal = next.getValue(); - List<Integer> mdKeyOrdinal = new ArrayList<Integer>(); - //Un sorted - List<Integer> mdKeyOrdinalForQuery = new ArrayList<Integer>(); - for (Integer ord : ordinal) { - mdKeyOrdinal.add(segmentProperties.getColumnGroupMdKeyOrdinal(next.getKey(), ord)); - mdKeyOrdinalForQuery.add(segmentProperties.getColumnGroupMdKeyOrdinal(next.getKey(), ord)); - } - Collections.sort(mdKeyOrdinal); - // get the masked byte range for column group - int[] maskByteRanges = getMaskedByteRangeBasedOrdinal(mdKeyOrdinal, keyGenerator); - // max key for column group - byte[] maxKey = getMaxKeyBasedOnOrinal(mdKeyOrdinal, keyGenerator); - restructureInfos.setKeyGenerator(keyGenerator); - restructureInfos.setMaskByteRanges(maskByteRanges); - restructureInfos.setMaxKey(maxKey); - restructureInfos.setMdkeyQueryDimensionOrdinal(ArrayUtils - .toPrimitive(mdKeyOrdinalForQuery.toArray(new Integer[mdKeyOrdinalForQuery.size()]))); - rowGroupToItsRSInfo - .put(segmentProperties.getDimensionOrdinalToBlockMapping().get(ordinal.get(0)), - restructureInfos); - } - return rowGroupToItsRSInfo; - } - - /** - * return true if given key is found in array - * - * @param data - * @param key - * @return - */ - public static boolean searchInArray(int[] data, int key) { - for (int i = 0; i < data.length; i++) { - if (key == data[i]) { - return true; - } - } - return false; - } - - /** - * Below method will be used to create a mapping of column group columns - * this mapping will have column group id to all the dimension ordinal - * present in the column group This mapping will be used during query - * execution, to create a mask key for the column group dimension which will - * be used in aggregation and filter query as column group dimension will be - * stored in bit level - */ - private static Map<Integer, List<Integer>> getColumnGroupAndItsOrdinalMapping( - List<QueryDimension> origdimensions) { - - List<QueryDimension> dimensions = new ArrayList<QueryDimension>(origdimensions.size()); - dimensions.addAll(origdimensions); - /** - * sort based on column group id - */ - Collections.sort(dimensions, new Comparator<QueryDimension>() { - - @Override public int compare(QueryDimension o1, QueryDimension o2) { - return Integer - .compare(o1.getDimension().columnGroupId(), o2.getDimension().columnGroupId()); - } - }); - // list of row groups this will store all the row group column - Map<Integer, List<Integer>> columnGroupAndItsOrdinalsMapping = - new HashMap<Integer, List<Integer>>(); - // to store a column group - List<Integer> currentColumnGroup = null; - // current index - int index = 0; - // previous column group to check all the column of row id has bee - // selected - int prvColumnGroupId = -1; - while (index < dimensions.size()) { - // if dimension group id is not zero and it is same as the previous - // column group id - // then we need to add ordinal of that column as it belongs to same - // column group - if (dimensions.get(index).getDimension().hasEncoding(Encoding.IMPLICIT)) { - index++; - continue; - } else if (!dimensions.get(index).getDimension().isColumnar() - && dimensions.get(index).getDimension().columnGroupId() == prvColumnGroupId - && null != currentColumnGroup) { - currentColumnGroup.add(dimensions.get(index).getDimension().getOrdinal()); - } - - // if dimension is not a columnar then it is column group column - else if (!dimensions.get(index).getDimension().isColumnar()) { - currentColumnGroup = new ArrayList<Integer>(); - columnGroupAndItsOrdinalsMapping - .put(dimensions.get(index).getDimension().columnGroupId(), currentColumnGroup); - currentColumnGroup.add(dimensions.get(index).getDimension().getOrdinal()); - } - // update the row id every time,this is required to group the - // columns - // of the same row group - prvColumnGroupId = dimensions.get(index).getDimension().columnGroupId(); - index++; - } - return columnGroupAndItsOrdinalsMapping; - } - - /** - * Below method will be used to get masked byte - * - * @param data actual data - * @param maxKey max key - * @param maskByteRanges mask byte range - * @param byteCount - * @return masked byte - */ - public static byte[] getMaskedKey(byte[] data, byte[] maxKey, int[] maskByteRanges, - int byteCount) { - byte[] maskedKey = new byte[byteCount]; - int counter = 0; - int byteRange = 0; - for (int i = 0; i < byteCount; i++) { - byteRange = maskByteRanges[i]; - if (byteRange != -1) { - maskedKey[counter++] = (byte) (data[byteRange] & maxKey[byteRange]); - } - } - return maskedKey; - } - - /** - * Below method will be used to fill block indexes of the query dimension - * which will be used in creating a output row Here is method we are passing - * two list which store the indexes one for dictionary column other for not - * dictionary column. This is done for specific purpose so that in one - * iteration we will be able to fill both type dimension block indexes - * - * @param queryDimensions dimension present in the query - * @param columnOrdinalToBlockIndexMapping column ordinal to block index mapping - * @param dictionaryDimensionBlockIndex list to store dictionary column block indexes - * @param noDictionaryDimensionBlockIndex list to store no dictionary block indexes - */ - public static void fillQueryDimensionsBlockIndexes(List<QueryDimension> queryDimensions, - Map<Integer, Integer> columnOrdinalToBlockIndexMapping, - Set<Integer> dictionaryDimensionBlockIndex, List<Integer> noDictionaryDimensionBlockIndex) { - for (QueryDimension queryDimension : queryDimensions) { - if (CarbonUtil.hasEncoding(queryDimension.getDimension().getEncoder(), Encoding.DICTIONARY) - && queryDimension.getDimension().numberOfChild() == 0) { - dictionaryDimensionBlockIndex - .add(columnOrdinalToBlockIndexMapping.get(queryDimension.getDimension().getOrdinal())); - } else if ( - !CarbonUtil.hasEncoding(queryDimension.getDimension().getEncoder(), Encoding.IMPLICIT) - && queryDimension.getDimension().numberOfChild() == 0) { - noDictionaryDimensionBlockIndex - .add(columnOrdinalToBlockIndexMapping.get(queryDimension.getDimension().getOrdinal())); - } - } - } - - /** - * Below method will be used to resolve the query model - * resolve will be setting the actual dimension and measure object - * as from driver only column name will be passes to avoid the heavy object - * serialization - * - * @param queryModel query model - */ - public static void resolveQueryModel(QueryModel queryModel) { - CarbonMetadata.getInstance().addCarbonTable(queryModel.getTable()); - // TODO need to load the table from table identifier - CarbonTable carbonTable = queryModel.getTable(); - String tableName = - queryModel.getAbsoluteTableIdentifier().getCarbonTableIdentifier().getTableName(); - // resolve query dimension - for (QueryDimension queryDimension : queryModel.getQueryDimension()) { - queryDimension - .setDimension(carbonTable.getDimensionByName(tableName, queryDimension.getColumnName())); - } - // resolve query measure - for (QueryMeasure queryMeasure : queryModel.getQueryMeasures()) { - // in case of count start column name will be count * so - // first need to check any measure is present or not and as if measure - // if measure is present and if first measure is not a default - // measure than add measure otherwise - // than add first dimension as a measure - //as currently if measure is not present then - //we are adding default measure so first condition will - //never come false but if in future we can remove so not removing first if check - if (queryMeasure.getColumnName().equals("count(*)")) { - if (carbonTable.getMeasureByTableName(tableName).size() > 0 && !carbonTable - .getMeasureByTableName(tableName).get(0).getColName() - .equals(CarbonCommonConstants.DEFAULT_INVISIBLE_DUMMY_MEASURE)) { - queryMeasure.setMeasure(carbonTable.getMeasureByTableName(tableName).get(0)); - } else { - CarbonMeasure dummyMeasure = new CarbonMeasure( - carbonTable.getDimensionByTableName(tableName).get(0).getColumnSchema(), 0); - queryMeasure.setMeasure(dummyMeasure); - } - } else { - queryMeasure - .setMeasure(carbonTable.getMeasureByName(tableName, queryMeasure.getColumnName())); - } - } - } - - /** - * below method will be used to get the actual type aggregator - * - * @param aggType - * @return index in aggrgetor - */ - public static int[] getActualTypeIndex(List<String> aggType) { - List<Integer> indexList = new ArrayList<Integer>(); - for (int i = 0; i < aggType.size(); i++) { - if (!CarbonCommonConstants.SUM.equals(aggType.get(i)) && !CarbonCommonConstants.AVERAGE - .equals(aggType.get(i))) { - indexList.add(i); - } - } - return ArrayUtils.toPrimitive(indexList.toArray(new Integer[indexList.size()])); - } - - /** - * Below method will be used to get the key structure for the column group - * - * @param segmentProperties segment properties - * @param dimColumnEvaluatorInfo dimension evaluator info - * @return key structure info for column group dimension - * @throws KeyGenException - */ - public static KeyStructureInfo getKeyStructureInfo(SegmentProperties segmentProperties, - DimColumnResolvedFilterInfo dimColumnEvaluatorInfo) throws KeyGenException { - int colGrpId = getColumnGroupId(segmentProperties, dimColumnEvaluatorInfo.getColumnIndex()); - KeyGenerator keyGenerator = segmentProperties.getColumnGroupAndItsKeygenartor().get(colGrpId); - List<Integer> mdKeyOrdinal = new ArrayList<Integer>(); - - mdKeyOrdinal.add(segmentProperties - .getColumnGroupMdKeyOrdinal(colGrpId, dimColumnEvaluatorInfo.getColumnIndex())); - int[] maskByteRanges = QueryUtil.getMaskedByteRangeBasedOrdinal(mdKeyOrdinal, keyGenerator); - byte[] maxKey = QueryUtil.getMaxKeyBasedOnOrinal(mdKeyOrdinal, keyGenerator); - KeyStructureInfo restructureInfos = new KeyStructureInfo(); - restructureInfos.setKeyGenerator(keyGenerator); - restructureInfos.setMaskByteRanges(maskByteRanges); - restructureInfos.setMaxKey(maxKey); - return restructureInfos; - } - - /** - * Below method will be used to get the column group id based on the ordinal - * - * @param segmentProperties segment properties - * @param ordinal ordinal to be searched - * @return column group id - */ - public static int getColumnGroupId(SegmentProperties segmentProperties, int ordinal) { - int[][] columnGroups = segmentProperties.getColumnGroups(); - int colGrpId = -1; - for (int i = 0; i < columnGroups.length; i++) { - if (columnGroups[i].length > 1) { - colGrpId++; - if (QueryUtil.searchInArray(columnGroups[i], ordinal)) { - break; - } - } - } - return colGrpId; - } - - /** - * Below method will be used to get the map of for complex dimension and its type - * which will be used to during query execution to - * - * @param queryDimensions complex dimension in query - * @param dimensionToBlockIndexMap dimension to block index in file map - * @return complex dimension and query type - */ - public static Map<Integer, GenericQueryType> getComplexDimensionsMap( - List<QueryDimension> queryDimensions, Map<Integer, Integer> dimensionToBlockIndexMap, - int[] eachComplexColumnValueSize, Map<String, Dictionary> columnIdToDictionaryMap, - Set<CarbonDimension> filterDimensions) { - Map<Integer, GenericQueryType> complexTypeMap = new HashMap<Integer, GenericQueryType>(); - for (QueryDimension dimension : queryDimensions) { - CarbonDimension actualDimension = dimension.getDimension(); - if (actualDimension.getNumberOfChild() == 0) { - continue; - } - fillParentDetails(dimensionToBlockIndexMap, actualDimension, complexTypeMap, - eachComplexColumnValueSize, columnIdToDictionaryMap); - } - if (null != filterDimensions) { - for (CarbonDimension filterDimension : filterDimensions) { - // do not fill nay details for implicit dimension type - if (filterDimension.hasEncoding(Encoding.IMPLICIT)) { - continue; - } - fillParentDetails(dimensionToBlockIndexMap, filterDimension, complexTypeMap, - eachComplexColumnValueSize, columnIdToDictionaryMap); - } - } - return complexTypeMap; - } - - private static void fillParentDetails(Map<Integer, Integer> dimensionToBlockIndexMap, - CarbonDimension dimension, Map<Integer, GenericQueryType> complexTypeMap, - int[] eachComplexColumnValueSize, Map<String, Dictionary> columnIdToDictionaryMap) { - int parentBlockIndex = dimensionToBlockIndexMap.get(dimension.getOrdinal()); - GenericQueryType parentQueryType = dimension.getDataType().equals(DataType.ARRAY) ? - new ArrayQueryType(dimension.getColName(), dimension.getColName(), parentBlockIndex) : - new StructQueryType(dimension.getColName(), dimension.getColName(), - dimensionToBlockIndexMap.get(dimension.getOrdinal())); - complexTypeMap.put(dimension.getOrdinal(), parentQueryType); - parentBlockIndex = - fillChildrenDetails(eachComplexColumnValueSize, columnIdToDictionaryMap, parentBlockIndex, - dimension, parentQueryType); - } - - private static int fillChildrenDetails(int[] eachComplexColumnValueSize, - Map<String, Dictionary> columnIdToDictionaryMap, int parentBlockIndex, - CarbonDimension dimension, GenericQueryType parentQueryType) { - for (int i = 0; i < dimension.getNumberOfChild(); i++) { - switch (dimension.getListOfChildDimensions().get(i).getDataType()) { - case ARRAY: - parentQueryType.addChildren( - new ArrayQueryType(dimension.getListOfChildDimensions().get(i).getColName(), - dimension.getColName(), ++parentBlockIndex)); - break; - case STRUCT: - parentQueryType.addChildren( - new StructQueryType(dimension.getListOfChildDimensions().get(i).getColName(), - dimension.getColName(), ++parentBlockIndex)); - break; - default: - boolean isDirectDictionary = CarbonUtil - .hasEncoding(dimension.getListOfChildDimensions().get(i).getEncoder(), - Encoding.DIRECT_DICTIONARY); - parentQueryType.addChildren( - new PrimitiveQueryType(dimension.getListOfChildDimensions().get(i).getColName(), - dimension.getColName(), ++parentBlockIndex, - dimension.getListOfChildDimensions().get(i).getDataType(), - eachComplexColumnValueSize[dimension.getListOfChildDimensions().get(i) - .getComplexTypeOrdinal()], columnIdToDictionaryMap - .get(dimension.getListOfChildDimensions().get(i).getColumnId()), - isDirectDictionary)); - } - if (dimension.getListOfChildDimensions().get(i).getNumberOfChild() > 0) { - parentBlockIndex = fillChildrenDetails(eachComplexColumnValueSize, columnIdToDictionaryMap, - parentBlockIndex, dimension.getListOfChildDimensions().get(i), parentQueryType); - } - } - return parentBlockIndex; - } - - public static void getAllFilterDimensions(FilterResolverIntf filterResolverTree, - Set<CarbonDimension> filterDimensions, Set<CarbonMeasure> filterMeasure) { - if (null == filterResolverTree) { - return; - } - List<ColumnExpression> dimensionResolvedInfos = new ArrayList<ColumnExpression>(); - Expression filterExpression = filterResolverTree.getFilterExpression(); - addColumnDimensions(filterExpression, filterDimensions, filterMeasure); - for (ColumnExpression info : dimensionResolvedInfos) { - if (info.isDimension() && info.getDimension().getNumberOfChild() > 0) { - filterDimensions.add(info.getDimension()); - } - } - } - - /** - * This method will check if a given expression contains a column expression - * recursively and add the dimension instance to the set which holds the dimension - * instances of the complex filter expressions. - */ - private static void addColumnDimensions(Expression expression, - Set<CarbonDimension> filterDimensions, Set<CarbonMeasure> filterMeasure) { - if (null != expression && expression instanceof ColumnExpression) { - if (((ColumnExpression) expression).isDimension()) { - filterDimensions.add(((ColumnExpression) expression).getDimension()); - } else { - filterMeasure.add((CarbonMeasure) ((ColumnExpression) expression).getCarbonColumn()); - } - return; - } else if (null != expression) { - for (Expression child : expression.getChildren()) { - addColumnDimensions(child, filterDimensions, filterMeasure); - } - } - } - - private static Set<Integer> getFilterMeasureOrdinal(Set<CarbonMeasure> filterMeasures) { - Set<Integer> filterMeasuresOrdinal = new HashSet<>(); - for (CarbonMeasure filterMeasure : filterMeasures) { - filterMeasuresOrdinal.add(filterMeasure.getOrdinal()); - } - return filterMeasuresOrdinal; - } - - private static Set<Integer> getFilterDimensionOrdinal(Set<CarbonDimension> filterDimensions) { - Set<Integer> filterDimensionsOrdinal = new HashSet<>(); - for (CarbonDimension filterDimension : filterDimensions) { - filterDimensionsOrdinal.add(filterDimension.getOrdinal()); - getChildDimensionOrdinal(filterDimension, filterDimensionsOrdinal); - } - return filterDimensionsOrdinal; - } - - /** - * Below method will be used to fill the children dimension column id - */ - private static void getChildDimensionOrdinal(CarbonDimension queryDimensions, - Set<Integer> filterDimensionsOrdinal) { - for (int j = 0; j < queryDimensions.numberOfChild(); j++) { - List<Encoding> encodingList = queryDimensions.getListOfChildDimensions().get(j).getEncoder(); - if (queryDimensions.getListOfChildDimensions().get(j).numberOfChild() > 0) { - getChildDimensionOrdinal(queryDimensions.getListOfChildDimensions().get(j), - filterDimensionsOrdinal); - } else if (!CarbonUtil.hasEncoding(encodingList, Encoding.DIRECT_DICTIONARY)) { - filterDimensionsOrdinal.add(queryDimensions.getListOfChildDimensions().get(j).getOrdinal()); - } - } - } -}
http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/executor/util/RestructureUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/executor/util/RestructureUtil.java b/core/src/main/java/org/apache/carbondata/scan/executor/util/RestructureUtil.java deleted file mode 100644 index c5daa17..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/executor/util/RestructureUtil.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * 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.carbondata.scan.executor.util; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.carbondata.core.metadata.Encoding; -import org.apache.carbondata.core.metadata.schema.table.column.CarbonDimension; -import org.apache.carbondata.core.metadata.schema.table.column.CarbonMeasure; -import org.apache.carbondata.core.constants.CarbonCommonConstants; -import org.apache.carbondata.scan.executor.infos.AggregatorInfo; -import org.apache.carbondata.scan.model.QueryDimension; -import org.apache.carbondata.scan.model.QueryMeasure; - -/** - * Utility class for restructuring - */ -public class RestructureUtil { - - /** - * Below method will be used to get the updated query dimension updation - * means, after restructuring some dimension will be not present in older - * table blocks in that case we need to select only those dimension out of - * query dimension which is present in the current table block - * - * @param queryDimensions - * @param tableBlockDimensions - * @return list of query dimension which is present in the table block - */ - public static List<QueryDimension> getUpdatedQueryDimension(List<QueryDimension> queryDimensions, - List<CarbonDimension> tableBlockDimensions, List<CarbonDimension> tableComplexDimension) { - List<QueryDimension> presentDimension = - new ArrayList<QueryDimension>(CarbonCommonConstants.DEFAULT_COLLECTION_SIZE); - // selecting only those dimension which is present in the query - for (QueryDimension queryDimension : queryDimensions) { - if (queryDimension.getDimension().hasEncoding(Encoding.IMPLICIT)) { - presentDimension.add(queryDimension); - } else { - for (CarbonDimension tableDimension : tableBlockDimensions) { - if (tableDimension.equals(queryDimension.getDimension())) { - presentDimension.add(queryDimension); - } - } - } - } - for (QueryDimension queryDimimension : queryDimensions) { - for (CarbonDimension tableDimension : tableComplexDimension) { - if (tableDimension.equals(queryDimimension.getDimension())) { - presentDimension.add(queryDimimension); - } - } - } - return presentDimension; - } - - /** - * Below method is to add dimension children for complex type dimension as - * internally we are creating dimension column for each each complex - * dimension so when complex query dimension request will come in the query, - * we need to add its children as it is hidden from the user For example if - * complex dimension is of Array of String[2] so we are storing 3 dimension - * and when user will query for complex type i.e. array type we need to add - * its children and then we will read respective block and create a tuple - * based on all three dimension - * - * @param queryDimensions current query dimensions - * @param tableBlockDimensions dimensions which is present in the table block - * @return updated dimension(after adding complex type children) - */ - public static List<CarbonDimension> addChildrenForComplexTypeDimension( - List<CarbonDimension> queryDimensions, List<CarbonDimension> tableBlockDimensions) { - List<CarbonDimension> updatedQueryDimension = new ArrayList<CarbonDimension>(); - int numberOfChildren = 0; - for (CarbonDimension queryDimension : queryDimensions) { - // if number of child is zero, then it is not a complex dimension - // so directly add it query dimension - if (queryDimension.numberOfChild() == 0) { - updatedQueryDimension.add(queryDimension); - } - // if number of child is more than 1 then add all its children - numberOfChildren = queryDimension.getOrdinal() + queryDimension.numberOfChild(); - for (int j = queryDimension.getOrdinal(); j < numberOfChildren; j++) { - updatedQueryDimension.add(tableBlockDimensions.get(j)); - } - } - return updatedQueryDimension; - } - - /** - * Below method will be used to get the aggregator info object - * in this method some of the properties which will be extracted - * from query measure and current block measures will be set - * - * @param queryMeasures measures present in query - * @param currentBlockMeasures current block measures - * @return aggregator info - */ - public static AggregatorInfo getAggregatorInfos(List<QueryMeasure> queryMeasures, - List<CarbonMeasure> currentBlockMeasures) { - AggregatorInfo aggregatorInfos = new AggregatorInfo(); - int numberOfMeasureInQuery = queryMeasures.size(); - int[] measureOrdinals = new int[numberOfMeasureInQuery]; - Object[] defaultValues = new Object[numberOfMeasureInQuery]; - boolean[] measureExistsInCurrentBlock = new boolean[numberOfMeasureInQuery]; - int index = 0; - for (QueryMeasure queryMeasure : queryMeasures) { - measureOrdinals[index] = queryMeasure.getMeasure().getOrdinal(); - // if query measure exists in current dimension measures - // then setting measure exists is true - // otherwise adding a default value of a measure - if (currentBlockMeasures.contains(queryMeasure.getMeasure())) { - measureExistsInCurrentBlock[index] = true; - } else { - defaultValues[index] = queryMeasure.getMeasure().getDefaultValue(); - } - index++; - } - aggregatorInfos.setDefaultValues(defaultValues); - aggregatorInfos.setMeasureOrdinals(measureOrdinals); - aggregatorInfos.setMeasureExists(measureExistsInCurrentBlock); - return aggregatorInfos; - } -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/BinaryExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/BinaryExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/BinaryExpression.java deleted file mode 100644 index e50525d..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/BinaryExpression.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.carbondata.scan.expression; - -public abstract class BinaryExpression extends Expression { - - private static final long serialVersionUID = 1L; - protected Expression left; - protected Expression right; - - public BinaryExpression(Expression left, Expression right) { - this.left = left; - this.right = right; - children.add(left); - children.add(right); - } - - public Expression getLeft() { - return left; - } - - public Expression getRight() { - return right; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/ColumnExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/ColumnExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/ColumnExpression.java deleted file mode 100644 index 4e19308..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/ColumnExpression.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * 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.carbondata.scan.expression; - -import org.apache.carbondata.core.metadata.DataType; -import org.apache.carbondata.core.metadata.schema.table.column.CarbonColumn; -import org.apache.carbondata.core.metadata.schema.table.column.CarbonDimension; -import org.apache.carbondata.scan.filter.intf.ExpressionType; -import org.apache.carbondata.scan.filter.intf.RowIntf; - -public class ColumnExpression extends LeafExpression { - - private static final long serialVersionUID = 1L; - - private String columnName; - - private boolean isDimension; - - private int colIndex = -1; - - private DataType dataType; - - private CarbonDimension dimension; - - private CarbonColumn carbonColumn; - - public ColumnExpression(String columnName, DataType dataType) { - this.columnName = columnName; - this.dataType = dataType; - - } - - public CarbonDimension getDimension() { - return dimension; - } - - public void setDimension(CarbonDimension dimension) { - this.dimension = dimension; - } - - public String getColumnName() { - return columnName; - } - - public void setColumnName(String columnName) { - this.columnName = columnName; - } - - public boolean isDimension() { - return isDimension; - } - - public void setDimension(boolean isDimension) { - this.isDimension = isDimension; - } - - public int getColIndex() { - return colIndex; - } - - public void setColIndex(int colIndex) { - this.colIndex = colIndex; - } - - public DataType getDataType() { - return dataType; - } - - public void setDataType(DataType dataType) { - this.dataType = dataType; - } - - @Override public ExpressionResult evaluate(RowIntf value) { - ExpressionResult expressionResult = - new ExpressionResult(dataType, (null == value ? null : value.getVal(colIndex))); - return expressionResult; - } - - @Override public ExpressionType getFilterExpressionType() { - // TODO Auto-generated method stub - return null; - } - - @Override public String getString() { - // TODO Auto-generated method stub - return "ColumnExpression(" + columnName + ')'; - } - - public CarbonColumn getCarbonColumn() { - return carbonColumn; - } - - public void setCarbonColumn(CarbonColumn carbonColumn) { - this.carbonColumn = carbonColumn; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/Expression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/Expression.java b/core/src/main/java/org/apache/carbondata/scan/expression/Expression.java deleted file mode 100644 index 06f6c72..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/Expression.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.carbondata.scan.expression; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import org.apache.carbondata.core.constants.CarbonCommonConstants; -import org.apache.carbondata.scan.expression.exception.FilterIllegalMemberException; -import org.apache.carbondata.scan.expression.exception.FilterUnsupportedException; -import org.apache.carbondata.scan.filter.intf.ExpressionType; -import org.apache.carbondata.scan.filter.intf.RowIntf; - -public abstract class Expression implements Serializable { - - private static final long serialVersionUID = -7568676723039530713L; - protected List<Expression> children = - new ArrayList<Expression>(CarbonCommonConstants.DEFAULT_COLLECTION_SIZE); - - public abstract ExpressionResult evaluate(RowIntf value) - throws FilterUnsupportedException, FilterIllegalMemberException; - - public abstract ExpressionType getFilterExpressionType(); - - public List<Expression> getChildren() { - return children; - } - - public abstract String getString(); - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/ExpressionResult.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/ExpressionResult.java b/core/src/main/java/org/apache/carbondata/scan/expression/ExpressionResult.java deleted file mode 100644 index 5e31693..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/ExpressionResult.java +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additiona l 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.carbondata.scan.expression; - -import java.math.BigDecimal; -import java.sql.Timestamp; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.apache.carbondata.core.metadata.DataType; -import org.apache.carbondata.core.constants.CarbonCommonConstants; -import org.apache.carbondata.core.util.CarbonProperties; -import org.apache.carbondata.scan.expression.exception.FilterIllegalMemberException; - -public class ExpressionResult implements Comparable<ExpressionResult> { - - protected DataType dataType; - - protected Object value; - - private List<ExpressionResult> expressionResults; - - private boolean isLiteral = false; - - public ExpressionResult(DataType dataType, Object value) { - this.dataType = dataType; - this.value = value; - } - - public ExpressionResult(DataType dataType, Object value, boolean isLiteral) { - this(dataType, value); - this.isLiteral = isLiteral; - } - - public ExpressionResult(List<ExpressionResult> expressionResults) { - this.expressionResults = expressionResults; - } - - public void set(DataType dataType, Object value) { - this.dataType = dataType; - this.value = value; - this.expressionResults = null; - } - - public DataType getDataType() { - return dataType; - } - - public Integer getInt() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - try { - return Integer.parseInt(value.toString()); - } catch (NumberFormatException e) { - throw new FilterIllegalMemberException(e); - } - case SHORT: - return ((Short) value).intValue(); - case INT: - case DOUBLE: - if (value instanceof Double) { - return ((Double) value).intValue(); - } - if (value instanceof Long) { - return ((Long) value).intValue(); - } - return (Integer) value; - case DATE: - if (value instanceof java.sql.Date) { - return (int) (((java.sql.Date) value).getTime()); - } else { - return (Integer) value; - } - case TIMESTAMP: - if (value instanceof Timestamp) { - return (int) (((Timestamp) value).getTime()); - } else { - if (isLiteral) { - Long l = (Long) value /1000; - return l.intValue(); - } - return (Integer) value; - } - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to integer type value"); - } - - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Integer type value"); - } - } - - public Short getShort() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - try { - return Short.parseShort(value.toString()); - } catch (NumberFormatException e) { - throw new FilterIllegalMemberException(e); - } - case SHORT: - case INT: - case DOUBLE: - - if (value instanceof Double) { - return ((Double) value).shortValue(); - } else if (value instanceof Integer) { - return ((Integer) value).shortValue(); - } - return (Short) value; - - case DATE: - - if (value instanceof java.sql.Date) { - return (short) (((java.sql.Date) value).getTime()); - } else { - return (Short) value; - } - case TIMESTAMP: - - if (value instanceof Timestamp) { - return (short) (((Timestamp) value).getTime()); - } else { - if (isLiteral) { - Long l = ((long)value/1000); - return l.shortValue(); - } - return (Short) value; - } - - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to integer type value"); - } - - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Integer type value"); - } - } - - public String getString() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case DATE: - case TIMESTAMP: - SimpleDateFormat parser = new SimpleDateFormat(CarbonProperties.getInstance() - .getProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT, - CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT)); - if (value instanceof Timestamp) { - return parser.format((Timestamp) value); - } else if (value instanceof java.sql.Date) { - return parser.format((java.sql.Date) value); - } else if (value instanceof Long) { - if (isLiteral) { - return parser.format(new Timestamp((long) value/1000)); - } - return parser.format(new Timestamp((long) value)); - } else if (value instanceof Integer) { - return parser.format(new java.sql.Date((int)value)); - } - return value.toString(); - default: - return value.toString(); - } - } catch (Exception e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to String type value"); - } - } - - public Double getDouble() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - try { - return Double.parseDouble(value.toString()); - } catch (NumberFormatException e) { - throw new FilterIllegalMemberException(e); - } - case SHORT: - return ((Short) value).doubleValue(); - case INT: - return ((Integer) value).doubleValue(); - case LONG: - return ((Long) value).doubleValue(); - case DOUBLE: - return (Double) value; - case DATE: - if (value instanceof java.sql.Date) { - return (double) ((java.sql.Date) value).getTime(); - } else { - return (Double) (value); - } - case TIMESTAMP: - if (value instanceof Timestamp) { - return (double) ((Timestamp) value).getTime(); - } else { - if (isLiteral) { - Long l = (Long) value/1000; - return l.doubleValue(); - } - return (Double) (value); - } - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to double type value"); - } - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Double type value"); - } - } - - public Long getLong() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - try { - return Long.parseLong(value.toString()); - } catch (NumberFormatException e) { - throw new FilterIllegalMemberException(e); - } - case SHORT: - return ((Short) value).longValue(); - case INT: - return (Long) value; - case LONG: - return (Long) value; - case DOUBLE: - return (Long) value; - case DATE: - if (value instanceof java.sql.Date) { - return ((java.sql.Date) value).getTime(); - } else { - return (Long) value; - } - case TIMESTAMP: - if (value instanceof Timestamp) { - return ((Timestamp) value).getTime(); - } else { - return (Long) value; - } - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Long type value"); - } - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Long type value"); - } - - } - - //Add to judge for BigDecimal - public BigDecimal getDecimal() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - try { - return new BigDecimal(value.toString()); - } catch (NumberFormatException e) { - throw new FilterIllegalMemberException(e); - } - case SHORT: - return new BigDecimal((short) value); - case INT: - return new BigDecimal((int) value); - case LONG: - return new BigDecimal((long) value); - case DOUBLE: - return new BigDecimal(value.toString()); - case DECIMAL: - return new BigDecimal(value.toString()); - case DATE: - if (value instanceof java.sql.Date) { - return new BigDecimal(((java.sql.Date) value).getTime()); - } else { - return new BigDecimal((long) value); - } - case TIMESTAMP: - if (value instanceof Timestamp) { - return new BigDecimal(((Timestamp) value).getTime()); - } else { - if (isLiteral) { - return new BigDecimal((long)value/1000); - } - return new BigDecimal((long) value); - } - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Long type value"); - } - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Long type value"); - } - - } - - public Long getTime() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - // Currently the query engine layer only supports yyyy-MM-dd HH:mm:ss date format - // no matter in which format the data is been stored, so while retrieving the direct - // surrogate value for filter member first it should be converted in date form as per - // above format and needs to retrieve time stamp. - SimpleDateFormat parser = - new SimpleDateFormat(CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT); - Date dateToStr; - try { - dateToStr = parser.parse(value.toString()); - return dateToStr.getTime(); - } catch (ParseException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Time/Long type value"); - } - case SHORT: - return ((Short) value).longValue(); - case INT: - case LONG: - return (Long) value; - case DOUBLE: - return (Long) value; - case DATE: - if (value instanceof java.sql.Date) { - return ((Date) value).getTime(); - } else { - return (Long) value; - } - case TIMESTAMP: - if (value instanceof Timestamp) { - return ((Timestamp) value).getTime(); - } else { - if (isLiteral) { - return (Long) value/1000; - } - return (Long) value; - } - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Time/Long type value"); - } - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Time/Long type value"); - } - - } - - public Boolean getBoolean() throws FilterIllegalMemberException { - if (value == null) { - return null; - } - try { - switch (this.getDataType()) { - case STRING: - try { - return Boolean.parseBoolean(value.toString()); - } catch (NumberFormatException e) { - throw new FilterIllegalMemberException(e); - } - - case BOOLEAN: - return Boolean.parseBoolean(value.toString()); - - default: - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to boolean type value"); - } - } catch (ClassCastException e) { - throw new FilterIllegalMemberException( - "Cannot convert" + this.getDataType().name() + " to Boolean type value"); - } - } - - public List<ExpressionResult> getList() { - if (null == expressionResults) { - List<ExpressionResult> a = new ArrayList<ExpressionResult>(20); - a.add(new ExpressionResult(dataType, value, isLiteral)); - return a; - } else { - return expressionResults; - } - } - - public List<String> getListAsString() throws FilterIllegalMemberException { - List<String> evaluateResultListFinal = new ArrayList<String>(20); - List<ExpressionResult> evaluateResultList = getList(); - for (ExpressionResult result : evaluateResultList) { - String resultString = result.getString(); - if (resultString == null) { - evaluateResultListFinal.add(CarbonCommonConstants.MEMBER_DEFAULT_VAL); - continue; - } - evaluateResultListFinal.add(resultString); - } - return evaluateResultListFinal; - } - - @Override public int hashCode() { - final int prime = 31; - int result = 1; - if (null != expressionResults) { - result = prime * result + expressionResults.hashCode(); - } else if (null != value) { - result = prime * result + value.toString().hashCode(); - } else { - result = prime * result + "".hashCode(); - } - - return result; - } - - @Override public boolean equals(Object obj) { - if (!(obj instanceof ExpressionResult)) { - return false; - } - if (this == obj) { - return true; - } - if (getClass() != obj.getClass()) { - return false; - } - ExpressionResult objToCompare = (ExpressionResult) obj; - boolean result = false; - if (this.value == objToCompare.value) { - return true; - } - try { - switch (this.getDataType()) { - case STRING: - result = this.getString().equals(objToCompare.getString()); - break; - case SHORT: - result = this.getShort().equals(objToCompare.getShort()); - break; - case INT: - result = this.getInt().equals(objToCompare.getInt()); - break; - case LONG: - case DATE: - case TIMESTAMP: - result = this.getLong().equals(objToCompare.getLong()); - break; - case DOUBLE: - result = this.getDouble().equals(objToCompare.getDouble()); - break; - case DECIMAL: - result = this.getDecimal().equals(objToCompare.getDecimal()); - break; - default: - break; - } - } catch (FilterIllegalMemberException ex) { - return false; - } - - return result; - } - - public boolean isNull() { - return value == null; - } - - @Override public int compareTo(ExpressionResult o) { - try { - switch (o.dataType) { - case SHORT: - case INT: - case LONG: - case DOUBLE: - Double d1 = this.getDouble(); - Double d2 = o.getDouble(); - return d1.compareTo(d2); - case DECIMAL: - java.math.BigDecimal val1 = this.getDecimal(); - java.math.BigDecimal val2 = o.getDecimal(); - return val1.compareTo(val2); - case DATE: - case TIMESTAMP: - SimpleDateFormat parser = new SimpleDateFormat(CarbonProperties.getInstance() - .getProperty(CarbonCommonConstants.CARBON_TIMESTAMP_FORMAT, - CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT)); - Date date1 = null; - Date date2 = null; - date1 = parser.parse(this.getString()); - date2 = parser.parse(o.getString()); - return date1.compareTo(date2); - case STRING: - default: - return this.getString().compareTo(o.getString()); - } - } catch (Exception e) { - return -1; - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/LeafExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/LeafExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/LeafExpression.java deleted file mode 100644 index 25c9ae6..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/LeafExpression.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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.carbondata.scan.expression; - -public abstract class LeafExpression extends Expression { - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/LiteralExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/LiteralExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/LiteralExpression.java deleted file mode 100644 index a26cd5d..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/LiteralExpression.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.carbondata.scan.expression; - -import org.apache.carbondata.core.metadata.DataType; -import org.apache.carbondata.scan.filter.intf.ExpressionType; -import org.apache.carbondata.scan.filter.intf.RowIntf; - -public class LiteralExpression extends LeafExpression { - - /** - * - */ - private static final long serialVersionUID = 1L; - private Object value; - private DataType dataType; - - public LiteralExpression(Object value, DataType dataType) { - this.value = value; - this.dataType = dataType; - } - - @Override public ExpressionResult evaluate(RowIntf value) { - ExpressionResult expressionResult = new ExpressionResult(dataType, this.value, true); - return expressionResult; - } - - public ExpressionResult getExpressionResult() { - ExpressionResult expressionResult = new ExpressionResult(dataType, this.value, true); - return expressionResult; - } - - @Override public ExpressionType getFilterExpressionType() { - // TODO Auto-generated method stub - return ExpressionType.LITERAL; - } - - @Override public String getString() { - // TODO Auto-generated method stub - return "LiteralExpression(" + value + ')'; - } - - /** - * getLiteralExpDataType. - * - * @return - */ - public DataType getLiteralExpDataType() { - return dataType; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/UnknownExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/UnknownExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/UnknownExpression.java deleted file mode 100644 index 01d813d..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/UnknownExpression.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.carbondata.scan.expression; - -import java.util.List; - -public abstract class UnknownExpression extends Expression { - - public abstract List<ColumnExpression> getAllColumnList(); - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java deleted file mode 100644 index 9db6953..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/BinaryConditionalExpression.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.carbondata.scan.expression.conditional; - -import org.apache.carbondata.scan.expression.Expression; -import org.apache.carbondata.scan.expression.logical.BinaryLogicalExpression; - -public abstract class BinaryConditionalExpression extends BinaryLogicalExpression - implements ConditionalExpression { - - /** - * - */ - private static final long serialVersionUID = 1L; - public boolean isNull; - public BinaryConditionalExpression(Expression left, Expression right) { - super(left, right); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/conditional/ConditionalExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/ConditionalExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/ConditionalExpression.java deleted file mode 100644 index 19653b6..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/ConditionalExpression.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.carbondata.scan.expression.conditional; - -import java.util.List; - -import org.apache.carbondata.scan.expression.ColumnExpression; -import org.apache.carbondata.scan.expression.ExpressionResult; - -public interface ConditionalExpression { - - // Will get the column informations involved in the expressions by - // traversing the tree - List<ColumnExpression> getColumnList(); - - boolean isSingleDimension(); - - List<ExpressionResult> getLiterals(); - -} http://git-wip-us.apache.org/repos/asf/incubator-carbondata/blob/952cf517/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java b/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java deleted file mode 100644 index db8b739..0000000 --- a/core/src/main/java/org/apache/carbondata/scan/expression/conditional/EqualToExpression.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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.carbondata.scan.expression.conditional; - -import org.apache.carbondata.core.metadata.DataType; -import org.apache.carbondata.scan.expression.Expression; -import org.apache.carbondata.scan.expression.ExpressionResult; -import org.apache.carbondata.scan.expression.exception.FilterIllegalMemberException; -import org.apache.carbondata.scan.expression.exception.FilterUnsupportedException; -import org.apache.carbondata.scan.filter.FilterUtil; -import org.apache.carbondata.scan.filter.intf.ExpressionType; -import org.apache.carbondata.scan.filter.intf.RowIntf; - -public class EqualToExpression extends BinaryConditionalExpression { - - private static final long serialVersionUID = 1L; - - public EqualToExpression(Expression left, Expression right) { - super(left, right); - } - - public EqualToExpression(Expression left, Expression right, boolean isNull) { - super(left, right); - this.isNull = isNull; - } - - @Override public ExpressionResult evaluate(RowIntf value) - throws FilterUnsupportedException, FilterIllegalMemberException { - ExpressionResult elRes = left.evaluate(value); - ExpressionResult erRes = right.evaluate(value); - - boolean result = false; - - ExpressionResult val1 = elRes; - ExpressionResult val2 = erRes; - - if (elRes.isNull() || erRes.isNull()) { - if (isNull) { - elRes.set(DataType.BOOLEAN, elRes.isNull() == erRes.isNull()); - } else { - elRes.set(DataType.BOOLEAN, false); - } - return elRes; - } - //default implementation if the data types are different for the resultsets - if (elRes.getDataType() != erRes.getDataType()) { - if (elRes.getDataType().getPrecedenceOrder() < erRes.getDataType().getPrecedenceOrder()) { - val2 = elRes; - val1 = erRes; - } - } - - switch (val1.getDataType()) { - case STRING: - result = val1.getString().equals(val2.getString()); - break; - case SHORT: - result = val1.getShort().equals(val2.getShort()); - break; - case INT: - result = val1.getInt().equals(val2.getInt()); - break; - case DOUBLE: - result = FilterUtil.nanSafeEqualsDoubles(val1.getDouble(), val2.getDouble()); - break; - case DATE: - case TIMESTAMP: - result = val1.getTime().equals(val2.getTime()); - break; - case LONG: - result = val1.getLong().equals(val2.getLong()); - break; - case DECIMAL: - result = val1.getDecimal().compareTo(val2.getDecimal()) == 0; - break; - default: - throw new FilterUnsupportedException( - "DataType: " + val1.getDataType() + " not supported for the filter expression"); - } - val1.set(DataType.BOOLEAN, result); - return val1; - } - - @Override public ExpressionType getFilterExpressionType() { - return ExpressionType.EQUALS; - } - - @Override public String getString() { - return "EqualTo(" + left.getString() + ',' + right.getString() + ')'; - } - -}