You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2015/05/15 05:06:47 UTC
[35/50] [abbrv] incubator-kylin git commit: KYLIN-749 fix ci
KYLIN-749 fix ci
Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/033f2aee
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/033f2aee
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/033f2aee
Branch: refs/heads/streaming-localdict
Commit: 033f2aeec991289147106c27a3b57a511bed0024
Parents: 33f8fee
Author: honma <ho...@ebay.com>
Authored: Tue May 12 15:19:03 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Tue May 12 15:20:57 2015 +0800
----------------------------------------------------------------------
.../org/apache/kylin/common/util/BasicTest.java | 2 +-
.../kylin/job/hadoop/invertedindex/IITest.java | 33 +++--
.../metadata/filter/CompareTupleFilter.java | 11 +-
.../metadata/filter/DateConditionModifier.java | 62 +++++++++
.../metadata/filter/IgnoreTsCondition.java | 65 ---------
.../metadata/filter/TsConditionEraser.java | 64 +++++++++
.../metadata/realization/StreamSQLDigest.java | 4 +-
.../kylin/query/enumerator/OLAPEnumerator.java | 20 ++-
.../apache/kylin/query/relnode/OLAPContext.java | 25 ++--
.../kylin/query/relnode/OLAPFilterRel.java | 4 +-
.../apache/kylin/query/test/IIQueryTest.java | 7 +-
.../apache/kylin/query/test/KylinQueryTest.java | 2 +-
.../apache/kylin/query/test/KylinTestBase.java | 33 +----
.../kylin/storage/cache/StorageLayerCache.java | 8 ++
.../DateConditionInplaceModifier.java | 63 ---------
.../DateConditionInplaceModifierTest.java | 34 -----
.../filter/DateConditionModifierTest.java | 33 +++++
.../storage/filter/IgnoreTsConditionTest.java | 133 -------------------
.../storage/filter/TsConditionEraserTest.java | 133 +++++++++++++++++++
19 files changed, 370 insertions(+), 366 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/kylin/common/util/BasicTest.java b/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
index efa1459..c259507 100644
--- a/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
+++ b/common/src/test/java/org/apache/kylin/common/util/BasicTest.java
@@ -63,7 +63,7 @@ public class BasicTest {
@Test
@Ignore("convenient trial tool for dev")
public void test1() throws Exception {
- System.out.println(time(946684800000L));
+ System.out.println(time(1367798400000L));
System.out.println(org.apache.kylin.common.util.DateFormat.formatToTimeStr(1000L * Integer.MAX_VALUE));
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
----------------------------------------------------------------------
diff --git a/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java b/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
index c3bd556..ecc3c23 100644
--- a/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
+++ b/job/src/test/java/org/apache/kylin/job/hadoop/invertedindex/IITest.java
@@ -1,10 +1,9 @@
package org.apache.kylin.job.hadoop.invertedindex;
-import java.io.IOException;
-import java.util.*;
-
-import javax.annotation.Nullable;
-
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import org.apache.commons.lang.NotImplementedException;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HRegionInfo;
@@ -27,9 +26,13 @@ import org.apache.kylin.invertedindex.index.TableRecordInfoDigest;
import org.apache.kylin.invertedindex.model.*;
import org.apache.kylin.job.constant.BatchConstants;
import org.apache.kylin.job.hadoop.cube.FactDistinctIIColumnsMapper;
+import org.apache.kylin.metadata.filter.ColumnTupleFilter;
+import org.apache.kylin.metadata.filter.CompareTupleFilter;
import org.apache.kylin.metadata.filter.ConstantTupleFilter;
+import org.apache.kylin.metadata.filter.TupleFilter;
import org.apache.kylin.metadata.model.FunctionDesc;
import org.apache.kylin.metadata.model.ParameterDesc;
+import org.apache.kylin.metadata.model.TblColRef;
import org.apache.kylin.storage.hbase.coprocessor.CoprocessorFilter;
import org.apache.kylin.storage.hbase.coprocessor.CoprocessorProjector;
import org.apache.kylin.storage.hbase.coprocessor.CoprocessorRowType;
@@ -46,10 +49,9 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.*;
/**
* Created by Hongbin Ma(Binmahone) on 3/26/15.
@@ -82,7 +84,6 @@ public class IITest extends LocalFileMetadataTestCase {
}
});
-
iiRows = Lists.newArrayList();
final Slice slice = new SliceBuilder(iiDesc, (short) 0, true).buildSlice(streamMessages, StringStreamParser.instance);
IIKeyValueCodec codec = new IIKeyValueCodec(slice.getInfo());
@@ -140,8 +141,16 @@ public class IITest extends LocalFileMetadataTestCase {
f1.setParameter(p1);
f1.setReturnType("decimal(19,4)");
+ TblColRef column = ii.getDescriptor().findColumnRef("default.test_kylin_fact", "cal_dt");
+ CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GTE);
+ ColumnTupleFilter columnFilter = new ColumnTupleFilter(column);
+ compareFilter.addChild(columnFilter);
+ ConstantTupleFilter constantFilter = null;
+ constantFilter = new ConstantTupleFilter(("2012-08-16"));
+ compareFilter.addChild(constantFilter);
+
EndpointAggregators aggregators = EndpointAggregators.fromFunctions(info, Collections.singletonList(f1));
- CoprocessorFilter filter = CoprocessorFilter.fromFilter(new ClearTextDictionary(info), ConstantTupleFilter.TRUE, FilterDecorator.FilterConstantsTreatment.AS_IT_IS);
+ CoprocessorFilter filter = CoprocessorFilter.fromFilter(new ClearTextDictionary(info), compareFilter, FilterDecorator.FilterConstantsTreatment.AS_IT_IS);
final Iterator<IIRow> iiRowIterator = iiRows.iterator();
@@ -205,8 +214,8 @@ public class IITest extends LocalFileMetadataTestCase {
}
}, type, projector, aggregators, filter);
+ Assert.assertEquals(2, response.getRowsList().size());
System.out.println(response.getRowsList().size());
-
Set<String> answers = Sets.newHashSet("120.4747", "26.8551");
for (org.apache.kylin.storage.hbase.coprocessor.endpoint.generated.IIProtos.IIResponseInternal.IIRow responseRow : response.getRowsList()) {
byte[] measuresBytes = responseRow.getMeasures().toByteArray();
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
index fc7fd2c..3fa6962 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/CompareTupleFilter.java
@@ -69,6 +69,8 @@ public class CompareTupleFilter extends TupleFilter {
// if value is before column, we need to reverse the operator. e.g. "1 >= c1" => "c1 <= 1"
if (!this.conditionValues.isEmpty() && needSwapOperator()) {
this.operator = SWAP_OP_MAP.get(this.operator);
+ TupleFilter last = this.children.remove(this.children.size() - 1);
+ this.children.add(0, last);
}
} else if (child instanceof ConstantTupleFilter) {
this.conditionValues.addAll(child.getValues());
@@ -90,15 +92,6 @@ public class CompareTupleFilter extends TupleFilter {
return conditionValues;
}
- public void updateValues(Collection<?> values, boolean clear) {
- if (clear) {
- this.conditionValues.clear();
- }
-
- this.conditionValues.addAll(values);
- this.firstCondValue = this.conditionValues.iterator().next();
- }
-
public Object getFirstValue() {
return firstCondValue;
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java
new file mode 100644
index 0000000..74e2d71
--- /dev/null
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/DateConditionModifier.java
@@ -0,0 +1,62 @@
+package org.apache.kylin.metadata.filter;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.kylin.common.util.DateFormat;
+import org.apache.kylin.metadata.model.TblColRef;
+
+import java.util.Collection;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 4/13/15.
+ */
+public class DateConditionModifier implements TupleFilterSerializer.Decorator {
+
+ private IdentityHashMap<TupleFilter, Boolean> dateCompareTupleChildren;
+
+ public DateConditionModifier(TupleFilter root) {
+ this.dateCompareTupleChildren = Maps.newIdentityHashMap();
+ }
+
+ /**
+ * replace filter on timestamp column to null, so that two tuple filter trees can
+ * be compared regardless of the filter condition on timestamp column (In top level where conditions concatenated by ANDs)
+ * @param filter
+ * @return
+ */
+ @Override
+ public TupleFilter onSerialize(TupleFilter filter) {
+
+ if (filter instanceof CompareTupleFilter) {
+ CompareTupleFilter cfilter = (CompareTupleFilter) filter;
+ List<? extends TupleFilter> children = cfilter.getChildren();
+
+ if (children == null || children.size() < 1) {
+ throw new IllegalArgumentException("Illegal compare filter: " + cfilter);
+ }
+
+ TblColRef col = cfilter.getColumn();
+ if (col == null || (!"date".equals(col.getDatatype()))) {
+ return cfilter;
+ }
+
+ for (TupleFilter child : filter.getChildren()) {
+ dateCompareTupleChildren.put(child, true);
+ }
+ }
+
+ if (filter instanceof ConstantTupleFilter && dateCompareTupleChildren.containsKey(filter)) {
+ ConstantTupleFilter constantTupleFilter = (ConstantTupleFilter) filter;
+ Set<String> newValues = Sets.newHashSet();
+
+ for (String value : (Collection<String>) constantTupleFilter.getValues()) {
+ newValues.add(DateFormat.formatToDateStr(Long.valueOf(value)));
+ }
+ return new ConstantTupleFilter(newValues);
+ }
+ return filter;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java
deleted file mode 100644
index 3ed5d07..0000000
--- a/metadata/src/main/java/org/apache/kylin/metadata/filter/IgnoreTsCondition.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.apache.kylin.metadata.filter;
-
-import java.util.IdentityHashMap;
-
-import org.apache.kylin.metadata.model.TblColRef;
-
-import com.google.common.collect.Maps;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 4/13/15.
- */
-public class IgnoreTsCondition implements TupleFilterSerializer.Decorator {
-
- private final TblColRef tsColumn;
- private final TupleFilter root;
-
- private IdentityHashMap<TupleFilter, Boolean> isInTopLevelANDs;
-
- public IgnoreTsCondition(TblColRef tsColumn, TupleFilter root) {
- this.tsColumn = tsColumn;
- this.root = root;
- this.isInTopLevelANDs = Maps.newIdentityHashMap();
- }
-
- /**
- * replace filter on timestamp column to null, so that two tuple filter trees can
- * be compared regardless of the filter condition on timestamp column (In top level where conditions concatenated by ANDs)
- * @param filter
- * @return
- */
- @Override
- public TupleFilter onSerialize(TupleFilter filter) {
-
- if (filter == null)
- return null;
-
- //we just need reference equal
- if (root == filter) {
- isInTopLevelANDs.put(filter, true);
- }
-
- if (isInTopLevelANDs.containsKey(filter)) {
- classifyChildrenByMarking(filter);
-
- if (filter instanceof CompareTupleFilter) {
- TblColRef c = ((CompareTupleFilter) filter).getColumn();
- if (c != null && c.equals(tsColumn)) {
- return null;
- }
- }
- }
-
- return filter;
- }
-
- private void classifyChildrenByMarking(TupleFilter filter) {
- if (filter instanceof LogicalTupleFilter) {
- if (filter.getOperator() == TupleFilter.FilterOperatorEnum.AND) {
- for (TupleFilter child : filter.getChildren()) {
- isInTopLevelANDs.put(child, true);
- }
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java b/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java
new file mode 100644
index 0000000..5a7ee40
--- /dev/null
+++ b/metadata/src/main/java/org/apache/kylin/metadata/filter/TsConditionEraser.java
@@ -0,0 +1,64 @@
+package org.apache.kylin.metadata.filter;
+
+import com.google.common.collect.Maps;
+import org.apache.kylin.metadata.model.TblColRef;
+
+import java.util.IdentityHashMap;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 4/13/15.
+ */
+public class TsConditionEraser implements TupleFilterSerializer.Decorator {
+
+ private final TblColRef tsColumn;
+ private final TupleFilter root;
+
+ private IdentityHashMap<TupleFilter, Boolean> isInTopLevelANDs;
+
+ public TsConditionEraser(TblColRef tsColumn, TupleFilter root) {
+ this.tsColumn = tsColumn;
+ this.root = root;
+ this.isInTopLevelANDs = Maps.newIdentityHashMap();
+ }
+
+ /**
+ * replace filter on timestamp column to null, so that two tuple filter trees can
+ * be compared regardless of the filter condition on timestamp column (In top level where conditions concatenated by ANDs)
+ * @param filter
+ * @return
+ */
+ @Override
+ public TupleFilter onSerialize(TupleFilter filter) {
+
+ if (filter == null)
+ return null;
+
+ //we just need reference equal
+ if (root == filter) {
+ isInTopLevelANDs.put(filter, true);
+ }
+
+ if (isInTopLevelANDs.containsKey(filter)) {
+ classifyChildrenByMarking(filter);
+
+ if (filter instanceof CompareTupleFilter) {
+ TblColRef c = ((CompareTupleFilter) filter).getColumn();
+ if (c != null && c.equals(tsColumn)) {
+ return null;
+ }
+ }
+ }
+
+ return filter;
+ }
+
+ private void classifyChildrenByMarking(TupleFilter filter) {
+ if (filter instanceof LogicalTupleFilter) {
+ if (filter.getOperator() == TupleFilter.FilterOperatorEnum.AND) {
+ for (TupleFilter child : filter.getChildren()) {
+ isInTopLevelANDs.put(child, true);
+ }
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java b/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
index fd3bba9..3a1d41a 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/realization/StreamSQLDigest.java
@@ -2,7 +2,7 @@ package org.apache.kylin.metadata.realization;
import java.util.Arrays;
-import org.apache.kylin.metadata.filter.IgnoreTsCondition;
+import org.apache.kylin.metadata.filter.TsConditionEraser;
import org.apache.kylin.metadata.filter.StringCodeSystem;
import org.apache.kylin.metadata.filter.TupleFilterSerializer;
import org.apache.kylin.metadata.model.TblColRef;
@@ -25,7 +25,7 @@ public class StreamSQLDigest {
this.sqlDigest = sqlDigest;
//must use new instance of IgnoreTsCondition
- IgnoreTsCondition decorator = new IgnoreTsCondition(tsCol, sqlDigest.filter);
+ TsConditionEraser decorator = new TsConditionEraser(tsCol, sqlDigest.filter);
filterSerialized = TupleFilterSerializer.serialize(sqlDigest.filter, decorator, StringCodeSystem.INSTANCE);
int nonFilterHashCode = calculateNonFilterHashCode();
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java b/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
index b7c2748..a5019ab 100644
--- a/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
+++ b/query/src/main/java/org/apache/kylin/query/enumerator/OLAPEnumerator.java
@@ -18,23 +18,25 @@
package org.apache.kylin.query.enumerator;
-import java.util.Map;
-import java.util.Properties;
-
import net.hydromatic.linq4j.Enumerator;
import net.hydromatic.optiq.DataContext;
import net.hydromatic.optiq.jdbc.OptiqConnection;
-
import org.apache.kylin.metadata.filter.CompareTupleFilter;
+import org.apache.kylin.metadata.filter.DateConditionModifier;
import org.apache.kylin.metadata.filter.TupleFilter;
+import org.apache.kylin.metadata.filter.TupleFilterSerializer;
import org.apache.kylin.metadata.tuple.ITuple;
import org.apache.kylin.metadata.tuple.ITupleIterator;
import org.apache.kylin.query.relnode.OLAPContext;
import org.apache.kylin.storage.IStorageEngine;
import org.apache.kylin.storage.StorageEngineFactory;
+import org.apache.kylin.storage.hbase.coprocessor.DictCodeSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Map;
+import java.util.Properties;
+
/**
* @author xjiang
*/
@@ -105,6 +107,10 @@ public class OLAPEnumerator implements Enumerator<Object[]> {
// bind dynamic variables
bindVariable(olapContext.filter);
+ //modify date condition
+ olapContext.filter = modifyDateCondition(olapContext.filter);
+ olapContext.resetSQLDigest();
+
// query storage engine
IStorageEngine storageEngine = StorageEngineFactory.getStorageEngine(olapContext.realization, true);
ITupleIterator iterator = storageEngine.search(olapContext.storageContext, olapContext.getSQLDigest(), olapContext.returnTupleInfo);
@@ -115,6 +121,12 @@ public class OLAPEnumerator implements Enumerator<Object[]> {
return iterator;
}
+ private TupleFilter modifyDateCondition(TupleFilter filter) {
+ DateConditionModifier filterDecorator = new DateConditionModifier(filter);
+ byte[] bytes = TupleFilterSerializer.serialize(filter, filterDecorator, DictCodeSystem.INSTANCE);
+ return TupleFilterSerializer.deserialize(bytes, DictCodeSystem.INSTANCE);
+ }
+
private void bindVariable(TupleFilter filter) {
if (filter == null) {
return;
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
index 2d89975..6121c80 100644
--- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
+++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java
@@ -18,25 +18,19 @@
package org.apache.kylin.query.relnode;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.kylin.metadata.realization.SQLDigest;
-import org.apache.kylin.query.schema.OLAPSchema;
-import org.eigenbase.reltype.RelDataType;
-import org.eigenbase.reltype.RelDataTypeField;
+import org.apache.kylin.metadata.filter.TupleFilter;
import org.apache.kylin.metadata.model.FunctionDesc;
import org.apache.kylin.metadata.model.JoinDesc;
import org.apache.kylin.metadata.model.TblColRef;
import org.apache.kylin.metadata.realization.IRealization;
+import org.apache.kylin.metadata.realization.SQLDigest;
+import org.apache.kylin.query.schema.OLAPSchema;
import org.apache.kylin.storage.StorageContext;
import org.apache.kylin.storage.tuple.TupleInfo;
-import org.apache.kylin.metadata.filter.TupleFilter;
+import org.eigenbase.reltype.RelDataType;
+import org.eigenbase.reltype.RelDataTypeField;
+
+import java.util.*;
/**
* @author xjiang
@@ -132,6 +126,11 @@ public class OLAPContext {
return sqlDigest;
}
+ public void resetSQLDigest()
+ {
+ this.sqlDigest = null;
+ }
+
public void setReturnTupleInfo(RelDataType rowType, ColumnRowType columnRowType) {
TupleInfo info = new TupleInfo();
List<RelDataTypeField> fieldList = rowType.getFieldList();
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
index 6f8f0f7..71cb2fa 100644
--- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
+++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPFilterRel.java
@@ -29,7 +29,6 @@ import net.hydromatic.optiq.runtime.SqlFunctions;
import org.apache.kylin.metadata.filter.*;
import org.apache.kylin.metadata.filter.TupleFilter.FilterOperatorEnum;
import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.storage.hbase.coprocessor.DateConditionInplaceModifier;
import org.eigenbase.rel.FilterRelBase;
import org.eigenbase.rel.RelCollation;
import org.eigenbase.rel.RelNode;
@@ -260,10 +259,11 @@ public class OLAPFilterRel extends FilterRelBase implements OLAPRel, EnumerableR
TupleFilterVisitor visitor = new TupleFilterVisitor(this.columnRowType, context);
context.filter = this.condition.accept(visitor);
- DateConditionInplaceModifier.modify(context.filter);
+
context.filterColumns = collectColumns(context.filter);
}
+
private Set<TblColRef> collectColumns(TupleFilter filter) {
Set<TblColRef> ret = Sets.newHashSet();
collectColumnsRecursively(filter, ret);
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java b/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
index 7a13607..37fc4f3 100644
--- a/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
+++ b/query/src/test/java/org/apache/kylin/query/test/IIQueryTest.java
@@ -61,7 +61,7 @@ public class IIQueryTest extends KylinQueryTest {
@Parameterized.Parameters
public static Collection<Object[]> configs() {
- return Arrays.asList(new Object[][]{{"inner"}, {"left"}});
+ return Arrays.asList(new Object[][] { { "inner" }, { "left" } });
}
public IIQueryTest(String joinType) throws Exception {
@@ -74,6 +74,11 @@ public class IIQueryTest extends KylinQueryTest {
}
@Test
+ public void testSingleRunQuery() throws Exception {
+ super.testSingleRunQuery();
+ }
+
+ @Test
public void testDetailedQuery() throws Exception {
execAndCompQuery("src/test/resources/query/sql_ii", null, true);
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java b/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
index e95da2c..40372ff 100644
--- a/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
+++ b/query/src/test/java/org/apache/kylin/query/test/KylinQueryTest.java
@@ -95,7 +95,7 @@ public class KylinQueryTest extends KylinTestBase {
@Test
public void testSingleRunQuery() throws Exception {
- String queryFileName = "src/test/resources/query/sql_orderby/query01.sql";
+ String queryFileName = "src/test/resources/query/sql_derived/query07.sql";
File sqlFile = new File(queryFileName);
if (sqlFile.exists()) {
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
----------------------------------------------------------------------
diff --git a/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java b/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
index c1da586..89fb01d 100644
--- a/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
+++ b/query/src/test/java/org/apache/kylin/query/test/KylinTestBase.java
@@ -18,31 +18,9 @@
package org.apache.kylin.query.test;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.LogManager;
-
+import com.google.common.io.Files;
import org.apache.commons.lang3.StringUtils;
+import org.apache.kylin.common.KylinConfig;
import org.dbunit.Assertion;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
@@ -56,8 +34,11 @@ import org.dbunit.ext.h2.H2Connection;
import org.dbunit.ext.h2.H2DataTypeFactory;
import org.junit.Assert;
-import com.google.common.io.Files;
-import org.apache.kylin.common.KylinConfig;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.sql.*;
+import java.util.*;
+import java.util.logging.LogManager;
/**
* Created by hongbin on 2/18/14.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java b/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java
new file mode 100644
index 0000000..18a0e02
--- /dev/null
+++ b/storage/src/main/java/org/apache/kylin/storage/cache/StorageLayerCache.java
@@ -0,0 +1,8 @@
+package org.apache.kylin.storage.cache;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 5/11/15.
+ */
+public interface StorageLayerCache {
+ boolean isCacheEnabled();
+}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java
----------------------------------------------------------------------
diff --git a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java b/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java
deleted file mode 100644
index 8569058..0000000
--- a/storage/src/main/java/org/apache/kylin/storage/hbase/coprocessor/DateConditionInplaceModifier.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.apache.kylin.storage.hbase.coprocessor;
-
-import com.google.common.collect.Lists;
-import org.apache.kylin.common.util.DateFormat;
-import org.apache.kylin.metadata.filter.CompareTupleFilter;
-import org.apache.kylin.metadata.filter.ConstantTupleFilter;
-import org.apache.kylin.metadata.filter.TupleFilter;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 5/7/15.
- *
- * For historical reasons, date types are encoded with DateStrDcitionary
- * rather than TimeStrDictionary, so the constant in CompareTupleFilter should
- * be corrected to "yyyy-MM-dd" format for date types
- */
-public class DateConditionInplaceModifier {
-
- public static void modify(TupleFilter filter) {
-
- if (filter instanceof CompareTupleFilter) {
- CompareTupleFilter cfilter = (CompareTupleFilter) filter;
- List<? extends TupleFilter> children = cfilter.getChildren();
-
- if (children == null || children.size() < 1) {
- throw new IllegalArgumentException("Illegal compare filter: " + cfilter);
- }
-
- if (cfilter.getColumn() == null || (!"date".equals(cfilter.getColumn().getColumnDesc().getTypeName()))) {
- return;
- }
-
- int nonConstantChild = 0;
- boolean firstUpdate = true;
- for (int i = 0; i < children.size(); ++i) {
- if (children.get(i) instanceof ConstantTupleFilter) {
- ConstantTupleFilter constantAsFilter = (ConstantTupleFilter) children.get(i);
- Collection<?> values = constantAsFilter.getValues();
- Collection<Object> newValues = Lists.newArrayList();
- for (Object x : values) {
- newValues.add(x == null ? null : DateFormat.formatToDateStr(Long.parseLong((String) x)));
- }
- cfilter.updateValues(newValues, firstUpdate);
- firstUpdate=false;
- } else {
- nonConstantChild++;
- }
- }
- if (nonConstantChild != 1) {
- throw new IllegalArgumentException("Illegal compare filter: " + cfilter);
- }
-
- return;
-
- } else {
- for (TupleFilter child : filter.getChildren()) {
- modify(child);
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java
deleted file mode 100644
index 204e8c6..0000000
--- a/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionInplaceModifierTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.apache.kylin.storage.filter;
-
-import org.apache.kylin.metadata.filter.ColumnTupleFilter;
-import org.apache.kylin.metadata.filter.CompareTupleFilter;
-import org.apache.kylin.metadata.filter.ConstantTupleFilter;
-import org.apache.kylin.metadata.filter.TupleFilter;
-import org.apache.kylin.metadata.model.ColumnDesc;
-import org.apache.kylin.metadata.model.TableDesc;
-import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.storage.hbase.coprocessor.DateConditionInplaceModifier;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 5/7/15.
- */
-public class DateConditionInplaceModifierTest extends FilterBaseTest {
- @Test
- public void basicTest() {
- TableDesc t1 = TableDesc.mockup("DEFAULT.TEST_KYLIN_FACT");
- ColumnDesc c1 = ColumnDesc.mockup(t1, 2, "CAL_DT", "date");
- TblColRef column = new TblColRef(c1);
-
- CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
- ColumnTupleFilter columnFilter = new ColumnTupleFilter(column);
- compareFilter.addChild(columnFilter);
- ConstantTupleFilter constantFilter = null;
- constantFilter = new ConstantTupleFilter("946684800000");
- compareFilter.addChild(constantFilter);
-
- DateConditionInplaceModifier.modify(compareFilter);
- Assert.assertEquals("2000-01-01",compareFilter.getFirstValue());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java
new file mode 100644
index 0000000..29cf7b1
--- /dev/null
+++ b/storage/src/test/java/org/apache/kylin/storage/filter/DateConditionModifierTest.java
@@ -0,0 +1,33 @@
+package org.apache.kylin.storage.filter;
+
+import org.apache.kylin.metadata.filter.*;
+import org.apache.kylin.metadata.model.ColumnDesc;
+import org.apache.kylin.metadata.model.TableDesc;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.storage.hbase.coprocessor.DictCodeSystem;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 5/7/15.
+ */
+public class DateConditionModifierTest extends FilterBaseTest {
+ @Test
+ public void basicTest() {
+ TableDesc t1 = TableDesc.mockup("DEFAULT.TEST_KYLIN_FACT");
+ ColumnDesc c1 = ColumnDesc.mockup(t1, 2, "CAL_DT", "date");
+ TblColRef column = new TblColRef(c1);
+
+ CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
+ ColumnTupleFilter columnFilter = new ColumnTupleFilter(column);
+ compareFilter.addChild(columnFilter);
+ ConstantTupleFilter constantFilter = null;
+ constantFilter = new ConstantTupleFilter("946684800000");
+ compareFilter.addChild(constantFilter);
+
+ DateConditionModifier filterDecorator = new DateConditionModifier(compareFilter);
+ byte[] bytes = TupleFilterSerializer.serialize(compareFilter, filterDecorator, DictCodeSystem.INSTANCE);
+ CompareTupleFilter compareTupleFilter = (CompareTupleFilter) TupleFilterSerializer.deserialize(bytes, DictCodeSystem.INSTANCE);
+ Assert.assertEquals("2000-01-01", compareTupleFilter.getFirstValue());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java
deleted file mode 100644
index 52fc5cd..0000000
--- a/storage/src/test/java/org/apache/kylin/storage/filter/IgnoreTsConditionTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.apache.kylin.storage.filter;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.apache.kylin.common.util.LocalFileMetadataTestCase;
-import org.apache.kylin.invertedindex.IIInstance;
-import org.apache.kylin.invertedindex.IIManager;
-import org.apache.kylin.invertedindex.index.TableRecordInfo;
-import org.apache.kylin.metadata.MetadataManager;
-import org.apache.kylin.metadata.filter.*;
-import org.apache.kylin.metadata.model.TableDesc;
-import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.storage.hbase.coprocessor.CoprocessorFilter;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.collect.Lists;
-
-/**
- * Created by Hongbin Ma(Binmahone) on 4/13/15.
- */
-public class IgnoreTsConditionTest extends LocalFileMetadataTestCase {
- IIInstance ii;
- TableRecordInfo tableRecordInfo;
- CoprocessorFilter filter;
- TableDesc factTableDesc;
-
- TblColRef caldt;
- TblColRef siteId;
-
- @Before
- public void setup() throws IOException {
- this.createTestMetadata();
- this.ii = IIManager.getInstance(getTestConfig()).getII("test_kylin_ii_left_join");
- this.tableRecordInfo = new TableRecordInfo(ii.getFirstSegment());
- this.factTableDesc = MetadataManager.getInstance(getTestConfig()).getTableDesc("DEFAULT.TEST_KYLIN_FACT");
- this.caldt = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "CAL_DT");
- this.siteId = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "LSTG_SITE_ID");
- }
-
- @After
- public void cleanUp() {
- cleanupTestMetadata();
- }
-
- private TupleFilter mockFilter1(int year) {
- CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
- aFilter.addChild(new ColumnTupleFilter(caldt));
- aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
-
- CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
- bFilter.addChild(new ColumnTupleFilter(caldt));
- bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
-
- CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
- cFilter.addChild(new ColumnTupleFilter(caldt));
- cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
-
- CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
- dFilter.addChild(new ColumnTupleFilter(siteId));
- dFilter.addChild(new ConstantTupleFilter("0"));
-
- LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
- subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
-
- CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
- outFilter.addChild(new ColumnTupleFilter(caldt));
- outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
-
- LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
- root.addChildren(Lists.newArrayList(subRoot, outFilter));
- return root;
- }
-
- private TupleFilter mockFilter2(int year) {
- CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
- aFilter.addChild(new ColumnTupleFilter(caldt));
- aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
-
- CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
- bFilter.addChild(new ColumnTupleFilter(caldt));
- bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
-
- CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
- cFilter.addChild(new ColumnTupleFilter(caldt));
- cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
-
- CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
- dFilter.addChild(new ColumnTupleFilter(siteId));
- dFilter.addChild(new ConstantTupleFilter("0"));
-
- LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.OR);
- subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
-
- CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
- outFilter.addChild(new ColumnTupleFilter(caldt));
- outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
-
- LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
- root.addChildren(Lists.newArrayList(subRoot, outFilter));
- return root;
- }
-
- @Test
- public void positiveTest() {
-
- TupleFilter a = mockFilter1(2000);
- TupleFilter b = mockFilter1(2001);
-
- IgnoreTsCondition decoratorA = new IgnoreTsCondition(caldt, a);
- byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
- IgnoreTsCondition decoratorB = new IgnoreTsCondition(caldt, b);
- byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
- Assert.assertArrayEquals(aBytes, bBytes);
-
- }
-
- @Test
- public void negativeTest()
- {
- TupleFilter a = mockFilter2(2000);
- TupleFilter b = mockFilter2(2001);
-
- IgnoreTsCondition decoratorA = new IgnoreTsCondition(caldt, a);
- byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
- IgnoreTsCondition decoratorB = new IgnoreTsCondition(caldt, b);
- byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
- Assert.assertFalse(Arrays.equals(aBytes,bBytes));
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/033f2aee/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java
----------------------------------------------------------------------
diff --git a/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java b/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java
new file mode 100644
index 0000000..c1fff70
--- /dev/null
+++ b/storage/src/test/java/org/apache/kylin/storage/filter/TsConditionEraserTest.java
@@ -0,0 +1,133 @@
+package org.apache.kylin.storage.filter;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.invertedindex.IIInstance;
+import org.apache.kylin.invertedindex.IIManager;
+import org.apache.kylin.invertedindex.index.TableRecordInfo;
+import org.apache.kylin.metadata.MetadataManager;
+import org.apache.kylin.metadata.filter.*;
+import org.apache.kylin.metadata.model.TableDesc;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.storage.hbase.coprocessor.CoprocessorFilter;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Created by Hongbin Ma(Binmahone) on 4/13/15.
+ */
+public class TsConditionEraserTest extends LocalFileMetadataTestCase {
+ IIInstance ii;
+ TableRecordInfo tableRecordInfo;
+ CoprocessorFilter filter;
+ TableDesc factTableDesc;
+
+ TblColRef caldt;
+ TblColRef siteId;
+
+ @Before
+ public void setup() throws IOException {
+ this.createTestMetadata();
+ this.ii = IIManager.getInstance(getTestConfig()).getII("test_kylin_ii_left_join");
+ this.tableRecordInfo = new TableRecordInfo(ii.getFirstSegment());
+ this.factTableDesc = MetadataManager.getInstance(getTestConfig()).getTableDesc("DEFAULT.TEST_KYLIN_FACT");
+ this.caldt = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "CAL_DT");
+ this.siteId = this.ii.getDescriptor().findColumnRef("DEFAULT.TEST_KYLIN_FACT", "LSTG_SITE_ID");
+ }
+
+ @After
+ public void cleanUp() {
+ cleanupTestMetadata();
+ }
+
+ private TupleFilter mockFilter1(int year) {
+ CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
+ aFilter.addChild(new ColumnTupleFilter(caldt));
+ aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
+
+ CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+ bFilter.addChild(new ColumnTupleFilter(caldt));
+ bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
+
+ CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+ cFilter.addChild(new ColumnTupleFilter(caldt));
+ cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
+
+ CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
+ dFilter.addChild(new ColumnTupleFilter(siteId));
+ dFilter.addChild(new ConstantTupleFilter("0"));
+
+ LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
+ subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
+
+ CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+ outFilter.addChild(new ColumnTupleFilter(caldt));
+ outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
+
+ LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
+ root.addChildren(Lists.newArrayList(subRoot, outFilter));
+ return root;
+ }
+
+ private TupleFilter mockFilter2(int year) {
+ CompareTupleFilter aFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.GT);
+ aFilter.addChild(new ColumnTupleFilter(caldt));
+ aFilter.addChild(new ConstantTupleFilter(year + "-01-01"));
+
+ CompareTupleFilter bFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+ bFilter.addChild(new ColumnTupleFilter(caldt));
+ bFilter.addChild(new ConstantTupleFilter(year + "-01-04"));
+
+ CompareTupleFilter cFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+ cFilter.addChild(new ColumnTupleFilter(caldt));
+ cFilter.addChild(new ConstantTupleFilter(year + "-01-03"));
+
+ CompareTupleFilter dFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ);
+ dFilter.addChild(new ColumnTupleFilter(siteId));
+ dFilter.addChild(new ConstantTupleFilter("0"));
+
+ LogicalTupleFilter subRoot = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.OR);
+ subRoot.addChildren(Lists.newArrayList(aFilter, bFilter, cFilter, dFilter));
+
+ CompareTupleFilter outFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.LTE);
+ outFilter.addChild(new ColumnTupleFilter(caldt));
+ outFilter.addChild(new ConstantTupleFilter(year + "-01-02"));
+
+ LogicalTupleFilter root = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND);
+ root.addChildren(Lists.newArrayList(subRoot, outFilter));
+ return root;
+ }
+
+ @Test
+ public void positiveTest() {
+
+ TupleFilter a = mockFilter1(2000);
+ TupleFilter b = mockFilter1(2001);
+
+ TsConditionEraser decoratorA = new TsConditionEraser(caldt, a);
+ byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
+ TsConditionEraser decoratorB = new TsConditionEraser(caldt, b);
+ byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
+ Assert.assertArrayEquals(aBytes, bBytes);
+
+ }
+
+ @Test
+ public void negativeTest()
+ {
+ TupleFilter a = mockFilter2(2000);
+ TupleFilter b = mockFilter2(2001);
+
+ TsConditionEraser decoratorA = new TsConditionEraser(caldt, a);
+ byte[] aBytes = TupleFilterSerializer.serialize(a, decoratorA, StringCodeSystem.INSTANCE);
+ TsConditionEraser decoratorB = new TsConditionEraser(caldt, b);
+ byte[] bBytes = TupleFilterSerializer.serialize(b, decoratorB, StringCodeSystem.INSTANCE);
+ Assert.assertFalse(Arrays.equals(aBytes,bBytes));
+ }
+}