Github user jackylk commented on a diff in the pull request:
https://github.com/apache/carbondata/pull/1996#discussion_r170451602
--- Diff:
core/src/main/java/org/apache/carbondata/core/scan/filter/executer/RowLevelFilterExecuterImpl.java
---
@@ -276,12 +277,82 @@ public BitSetGroup applyFilter(BlocksChunkHolder
blockChunkHolder, boolean useBi
public boolean applyFilter(RowIntf value, int dimOrdinalMax)
throws FilterUnsupportedException, IOException {
try {
- return exp.evaluate(value).getBoolean();
+ Boolean result = exp.evaluate(createRow(value,
dimOrdinalMax)).getBoolean();
+ return result == null ? false : result;
} catch (FilterIllegalMemberException e) {
throw new FilterUnsupportedException(e);
}
}
+ /**
+ * create row for row filter to evaluate expression
+ */
+ private RowIntf createRow(RowIntf value, int dimOrdinalMax) throws
IOException {
+ Object[] record = new Object[value.size()];
+ String memberString;
+ for (int i = 0; i < dimColEvaluatorInfoList.size(); i++) {
+ DimColumnResolvedFilterInfo dimColumnEvaluatorInfo =
dimColEvaluatorInfoList.get(i);
+ int index = dimColumnEvaluatorInfo.getDimension().getOrdinal();
+ // if filter dimension is not present in the current add its default
value
+ if (!isDimensionPresentInCurrentBlock[i]) {
+ // fill default value here
+ record[index] = getDimensionDefaultValue(dimColumnEvaluatorInfo);
+ continue;
+ }
+ if
(!dimColumnEvaluatorInfo.getDimension().getDataType().isComplexType()) {
+ if (!dimColumnEvaluatorInfo.isDimensionExistsInCurrentSilce()) {
+ record[index] =
dimColumnEvaluatorInfo.getDimension().getDefaultValue();
+ }
+ byte[] memberBytes = (byte[]) value.getVal(index);
+ if
(!dimColumnEvaluatorInfo.getDimension().hasEncoding(Encoding.DICTIONARY)) {
+ if (null != memberBytes) {
+ if
(Arrays.equals(CarbonCommonConstants.MEMBER_DEFAULT_VAL_ARRAY, memberBytes)) {
+ memberBytes = null;
+ } else if (memberBytes.length == 0) {
+ memberBytes = null;
+ }
+ record[index] =
DataTypeUtil.getDataBasedOnDataTypeForNoDictionaryColumn(memberBytes,
+ dimColumnEvaluatorInfo.getDimension().getDataType());
+ }
+ } else {
+ int dictionaryValue = ByteUtil.toInt(memberBytes, 0);
+ if
(dimColumnEvaluatorInfo.getDimension().hasEncoding(Encoding.DICTIONARY)
+ &&
!dimColumnEvaluatorInfo.getDimension().hasEncoding(Encoding.DIRECT_DICTIONARY))
{
+ memberString =
+
getFilterActualValueFromDictionaryValue(dimColumnEvaluatorInfo,
dictionaryValue);
+ record[index] =
DataTypeUtil.getDataBasedOnDataType(memberString,
+ dimColumnEvaluatorInfo.getDimension().getDataType());
+ } else if (
+
dimColumnEvaluatorInfo.getDimension().hasEncoding(Encoding.DIRECT_DICTIONARY)) {
+ Object member =
getFilterActualValueFromDirectDictionaryValue(dimColumnEvaluatorInfo,
+ dictionaryValue);
+ record[index] = member;
+ }
+ }
+ } else {
+ record[index] = value.getVal(index);
+ }
+ }
+
+ for (int i = 0; i < msrColEvalutorInfoList.size(); i++) {
+ MeasureColumnResolvedFilterInfo msrColumnEvalutorInfo =
msrColEvalutorInfoList.get(i);
+ int index = msrColumnEvalutorInfo.getMeasure().getOrdinal() +
dimOrdinalMax;
+ // add default value for the measure in case filter measure is not
present
+ // in the current block measure list
+ if (!isMeasurePresentInCurrentBlock[i]) {
+ byte[] defaultValue =
msrColumnEvalutorInfo.getCarbonColumn().getDefaultValue();
+ record[index] = RestructureUtil
+
.getMeasureDefaultValue(msrColumnEvalutorInfo.getCarbonColumn().getColumnSchema(),
--- End diff --
move `. getMeasureDefaultValue` to previous line
---