/* * 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.query; import java.io.File; import java.nio.charset.Charset; import java.sql.SQLException; import java.util.List; import java.util.Random; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.kylin.common.util.HadoopUtil; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.ITable; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Sets; /** */ public class ITMassInQueryTest extends KylinTestBase { private static final Logger logger = LoggerFactory.getLogger(ITMassInQueryTest.class); FileSystem fileSystem; Set<Long> vipSellers; @BeforeClass public static void setUp() throws SQLException { } @AfterClass public static void tearDown() { } @Before public void setup() throws Exception { ITKylinQueryTest.clean(); ITKylinQueryTest.joinType = "left"; ITKylinQueryTest.setupAll(); fileSystem = HadoopUtil.getWorkingFileSystem(); int sellerCount = 200; Random r = new Random(); vipSellers = Sets.newHashSet(); for (int i = 0; i < sellerCount; i++) { vipSellers.add(10000000L + r.nextInt(1500)); } Path path = new Path("/tmp/vip_customers.txt"); fileSystem.delete(path, false); FSDataOutputStream outputStream = fileSystem.create(path); org.apache.commons.io.IOUtils.write(StringUtils.join(vipSellers, "\n"), outputStream, Charset.defaultCharset()); outputStream.close(); System.out.println("The filter is " + vipSellers); } @After public void after() throws Exception { ITKylinQueryTest.clean(); } @Test @Ignore public void testMassInQuery() throws Exception { compare("src/test/resources/query/sql_massin", null, true); } @Test @Ignore public void testMassInWithDistinctCount() throws Exception { run("src/test/resources/query/sql_massin_distinct", null, true); } protected void run(String queryFolder, String[] exclusiveQuerys, boolean needSort) throws Exception { logger.info("---------- test folder: " + queryFolder); Set<String> exclusiveSet = buildExclusiveSet(exclusiveQuerys); List<File> sqlFiles = getFilesFromFolder(new File(queryFolder), ".sql"); for (File sqlFile : sqlFiles) { String queryName = StringUtils.split(sqlFile.getName(), '.')[0]; if (exclusiveSet.contains(queryName)) { continue; } String sql = getTextFromFile(sqlFile); // execute Kylin logger.info("Query Result from Kylin - " + queryName + " (" + queryFolder + ")"); IDatabaseConnection kylinConn = new DatabaseConnection(cubeConnection); ITable kylinTable = executeQuery(kylinConn, queryName, sql, needSort); printResult(kylinTable); } } protected void compare(String queryFolder, String[] exclusiveQuerys, boolean needSort) throws Exception { logger.info("---------- test folder: " + queryFolder); Set<String> exclusiveSet = buildExclusiveSet(exclusiveQuerys); List<File> sqlFiles = getFilesFromFolder(new File(queryFolder), ".sql"); for (File sqlFile : sqlFiles) { String queryName = StringUtils.split(sqlFile.getName(), '.')[0]; if (exclusiveSet.contains(queryName)) { continue; } String sql = getTextFromFile(sqlFile); // execute Kylin logger.info("Query Result from Kylin - " + queryName + " (" + queryFolder + ")"); IDatabaseConnection kylinConn = new DatabaseConnection(cubeConnection); ITable kylinTable = executeQuery(kylinConn, queryName, sql, needSort); // execute H2 sql = sql.replace("massin(test_kylin_fact.SELLER_ID,'vip_customers')", "test_kylin_fact.SELLER_ID in ( " + org.apache.commons.lang.StringUtils.join(vipSellers, ",") + ")"); logger.info("Query Result from H2 - " + queryName); logger.info("Query for H2 - " + sql); ITable h2Table = executeQuery(newH2Connection(), queryName, sql, needSort); try { // compare the result assertTableEquals(h2Table, kylinTable); } catch (Throwable t) { logger.info("execAndCompQuery failed on: " + sqlFile.getAbsolutePath()); throw t; } } } }