Repository: kylin
Updated Branches:
  refs/heads/2.x-staging cd5076497 -> f27f7f3e1


KYLIN-976 Some measures only aggregates in BaseCuboid (Test)


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/f27f7f3e
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/f27f7f3e
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/f27f7f3e

Branch: refs/heads/2.x-staging
Commit: f27f7f3e11371e9ab91f7c82dedd50986af53681
Parents: cd50764
Author: lidongsjtu <don...@ebay.com>
Authored: Mon Dec 28 10:13:44 2015 +0800
Committer: lidongsjtu <don...@ebay.com>
Committed: Mon Dec 28 10:13:44 2015 +0800

----------------------------------------------------------------------
 .../kylin/engine/mr/steps/CubeReducerTest.java  |  85 ++++++++++
 .../hbase/cube/CubeStorageQueryTest.java        | 154 +++++++++++++++++++
 2 files changed, 239 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/f27f7f3e/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
----------------------------------------------------------------------
diff --git 
a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java 
b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
index e79bd3a..aa5e77e 100644
--- 
a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
+++ 
b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -36,8 +37,13 @@ import org.apache.kylin.cube.CubeManager;
 import org.apache.kylin.cube.kv.RowConstants;
 import org.apache.kylin.cube.model.CubeDesc;
 import org.apache.kylin.engine.mr.common.BatchConstants;
+import org.apache.kylin.measure.MeasureAggregator;
 import org.apache.kylin.measure.MeasureCodec;
+import org.apache.kylin.measure.MeasureIngester;
+import org.apache.kylin.measure.MeasureType;
 import org.apache.kylin.metadata.datatype.LongMutable;
+import org.apache.kylin.metadata.model.FunctionDesc;
+import org.apache.kylin.metadata.model.MeasureDesc;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -108,6 +114,53 @@ public class CubeReducerTest extends 
LocalFileMetadataTestCase {
         assertTrue(result.contains(p3));
     }
 
+    @Test
+    public void testReducerOnlyAggrInBaseCuboid() throws Exception {
+        reduceDriver.getConfiguration().set(BatchConstants.CFG_CUBE_NAME, 
"test_kylin_cube_with_slr_ready");
+        
reduceDriver.getConfiguration().setInt(BatchConstants.CFG_CUBE_CUBOID_LEVEL, 1);
+
+        CubeDesc cubeDesc = 
CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_with_slr_ready").getDescriptor();
+        MeasureDesc measureDesc = cubeDesc.getMeasures().get(0);
+        FunctionDesc functionDesc = measureDesc.getFunction();
+        Field field = FunctionDesc.class.getDeclaredField("measureType");
+        field.setAccessible(true);
+        MeasureType origMeasureType = functionDesc.getMeasureType();
+        field.set(functionDesc, new MockUpMeasureType(origMeasureType));
+
+        MeasureCodec codec = new MeasureCodec(cubeDesc.getMeasures());
+
+        Text key1 = new Text("72010ustech");
+        List<Text> values1 = new ArrayList<Text>();
+        values1.add(newValueText(codec, "15.09", "15.09", "15.09", 1, 100));
+        values1.add(newValueText(codec, "20.34", "20.34", "20.34", 1, 200));
+        values1.add(newValueText(codec, "10", "10", "10", 1, 300));
+
+        Text key2 = new Text("1tech");
+        List<Text> values2 = new ArrayList<Text>();
+        values2.add(newValueText(codec, "15.09", "15.09", "15.09", 1, 500));
+        values2.add(newValueText(codec, "20.34", "20.34", "20.34", 1, 1000));
+
+        Text key3 = new Text("0");
+        List<Text> values3 = new ArrayList<Text>();
+        values3.add(newValueText(codec, "146.52", "146.52", "146.52", 0, 0));
+
+        reduceDriver.withInput(key1, values1);
+        reduceDriver.withInput(key2, values2);
+        reduceDriver.withInput(key3, values3);
+
+        List<Pair<Text, Text>> result = reduceDriver.run();
+
+        Pair<Text, Text> p1 = new Pair<Text, Text>(new Text("72010ustech"), 
newValueText(codec, "0", "10", "20.34", 3, 600));
+        Pair<Text, Text> p2 = new Pair<Text, Text>(new Text("1tech"), 
newValueText(codec, "0", "15.09", "20.34", 2, 1500));
+        Pair<Text, Text> p3 = new Pair<Text, Text>(new Text("0"), 
newValueText(codec, "0", "146.52", "146.52", 0, 0));
+
+        assertEquals(3, result.size());
+
+        assertTrue(result.contains(p1));
+        assertTrue(result.contains(p2));
+        assertTrue(result.contains(p3));
+    }
+
     private Text newValueText(MeasureCodec codec, String sum, String min, 
String max, int count, int item_count) {
         Object[] values = new Object[] { new BigDecimal(sum), new 
BigDecimal(min), new BigDecimal(max), new LongMutable(count), new 
LongMutable(item_count) };
 
@@ -119,4 +172,36 @@ public class CubeReducerTest extends 
LocalFileMetadataTestCase {
         return t;
     }
 
+    class MockUpMeasureType extends MeasureType {
+        MeasureType origMeasureType;
+
+        public MockUpMeasureType(MeasureType origMeasureType) {
+            this.origMeasureType = origMeasureType;
+        }
+
+        @Override
+        public boolean onlyAggrInBaseCuboid() {
+            return true;
+        }
+
+        @Override
+        public MeasureIngester newIngester() {
+            return origMeasureType.newIngester();
+        }
+
+        @Override
+        public MeasureAggregator newAggregator() {
+            return origMeasureType.newAggregator();
+        }
+
+        @Override
+        public boolean needRewrite() {
+            return origMeasureType.needRewrite();
+        }
+
+        @Override
+        public Class<?> getRewriteCalciteAggrFunctionClass() {
+            return origMeasureType.getRewriteCalciteAggrFunctionClass();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/f27f7f3e/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/CubeStorageQueryTest.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/CubeStorageQueryTest.java
 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/CubeStorageQueryTest.java
new file mode 100644
index 0000000..8c90abd
--- /dev/null
+++ 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/CubeStorageQueryTest.java
@@ -0,0 +1,154 @@
+/*
+ * 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.kylin.storage.hbase.cube;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.kylin.common.util.LocalFileMetadataTestCase;
+import org.apache.kylin.cube.CubeInstance;
+import org.apache.kylin.cube.CubeManager;
+import org.apache.kylin.cube.cuboid.Cuboid;
+import org.apache.kylin.cube.model.CubeDesc;
+import org.apache.kylin.measure.MeasureAggregator;
+import org.apache.kylin.measure.MeasureIngester;
+import org.apache.kylin.measure.MeasureType;
+import org.apache.kylin.metadata.MetadataManager;
+import org.apache.kylin.metadata.model.FunctionDesc;
+import org.apache.kylin.metadata.model.MeasureDesc;
+import org.apache.kylin.metadata.model.TblColRef;
+import org.apache.kylin.storage.ICachableStorageQuery;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+/**
+ * Created by dongli on 12/28/15.
+ */
+public class CubeStorageQueryTest extends LocalFileMetadataTestCase {
+
+    private CubeInstance cube;
+
+    public CubeManager getCubeManager() {
+        return CubeManager.getInstance(getTestConfig());
+    }
+
+    private CubeInstance getTestKylinCubeWithSeller() {
+        return getCubeManager().getCube("test_kylin_cube_with_slr_empty");
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        this.createTestMetadata();
+        MetadataManager.clearCache();
+
+        cube = getTestKylinCubeWithSeller();
+    }
+
+    @After
+    public void after() throws Exception {
+        this.cleanupTestMetadata();
+    }
+
+    private void validateIdentifyCuboidOnStorageQnery(CubeDesc cubeDesc, 
ICachableStorageQuery query) {
+        long baseCuboidId = cubeDesc.getRowkey().getFullMask();
+
+        try {
+            Method method = 
query.getClass().getDeclaredMethod("identifyCuboid", Set.class, 
Collection.class);
+            method.setAccessible(true);
+
+            Set<TblColRef> dimensions = Sets.newHashSet();
+            List<FunctionDesc> metrics = Lists.newArrayList();
+
+            Object ret = method.invoke(query, dimensions, metrics);
+
+            assertTrue(ret instanceof Cuboid);
+            assertNotEquals(baseCuboidId, ((Cuboid) ret).getId());
+
+            for (MeasureDesc measureDesc : cubeDesc.getMeasures()) {
+                Collections.addAll(metrics, measureDesc.getFunction());
+            }
+
+            FunctionDesc mockUpFuncDesc = new FunctionDesc();
+            Field field = FunctionDesc.class.getDeclaredField("measureType");
+            field.setAccessible(true);
+            field.set(mockUpFuncDesc, new MockUpMeasureType());
+            metrics.add(mockUpFuncDesc);
+
+            ret = method.invoke(query, dimensions, metrics);
+            assertEquals(baseCuboidId, ((Cuboid) ret).getId());
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testIdentifyCuboidV1() {
+        CubeDesc cubeDesc = cube.getDescriptor();
+        ICachableStorageQuery query = new 
org.apache.kylin.storage.hbase.cube.v1.CubeStorageQuery(cube);
+        validateIdentifyCuboidOnStorageQnery(cubeDesc, query);
+    }
+
+    @Test
+    public void testIdentifyCuboidV2() {
+        CubeDesc cubeDesc = cube.getDescriptor();
+        ICachableStorageQuery query = new 
org.apache.kylin.storage.hbase.cube.v2.CubeStorageQuery(cube);
+        validateIdentifyCuboidOnStorageQnery(cubeDesc, query);
+    }
+
+    class MockUpMeasureType extends MeasureType<String> {
+
+        @Override
+        public MeasureIngester<String> newIngester() {
+            return null;
+        }
+
+        @Override
+        public MeasureAggregator<String> newAggregator() {
+            return null;
+        }
+
+        @Override
+        public boolean needRewrite() {
+            return false;
+        }
+
+        @Override
+        public Class<?> getRewriteCalciteAggrFunctionClass() {
+            return null;
+        }
+
+        @Override
+        public boolean onlyAggrInBaseCuboid() {
+            return true;
+        }
+    }
+}

Reply via email to