This is an automated email from the ASF dual-hosted git repository. nju_yaho pushed a commit to tag ebay-3.1.0-release-20200701 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 574f5c0f918266bc8ae42f7ea065c458602d26ab Author: Zhong, Yanghong <nju_y...@apache.org> AuthorDate: Mon Jun 22 14:01:12 2020 +0800 KYLIN-4596 Consider CubeInstance reinitialization time when querying system cubes --- .../apache/kylin/rest/util/SqlCreationUtil.java | 84 ++++++++++++++++++---- 1 file changed, 69 insertions(+), 15 deletions(-) diff --git a/server-base/src/main/java/org/apache/kylin/rest/util/SqlCreationUtil.java b/server-base/src/main/java/org/apache/kylin/rest/util/SqlCreationUtil.java index 021bb8b..505cf84 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/util/SqlCreationUtil.java +++ b/server-base/src/main/java/org/apache/kylin/rest/util/SqlCreationUtil.java @@ -19,6 +19,7 @@ package org.apache.kylin.rest.util; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Map; @@ -27,6 +28,7 @@ import java.util.stream.Collectors; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.util.StringUtil; import org.apache.kylin.cube.CubeInstance; +import org.apache.kylin.cube.CubeManager; import org.apache.kylin.metrics.MetricsManager; import org.apache.kylin.metrics.lib.impl.RecordEventTimeDetail; import org.apache.kylin.metrics.lib.impl.TimePropertyEnum; @@ -73,7 +75,7 @@ public class SqlCreationUtil { String table = MetricsManager .getSystemTableFromSubject(KylinConfig.getInstanceFromEnv().getKylinMetricsSubjectQuery()); - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); if (StringUtil.isEmpty(projectName)) { addFilter(filterMap, QueryPropertyEnum.PROJECT.toString(), "<>", MetricsManager.SYSTEM_PROJECT, String.class.getName()); @@ -83,6 +85,7 @@ public class SqlCreationUtil { } if (!StringUtil.isEmpty(cubeName)) { addFilter(filterMap, QueryPropertyEnum.REALIZATION.toString(), "=", cubeName, String.class.getName()); + addCubeCreationUTCFilter(filterMap, cubeName); } addFilter(filterMap, QueryPropertyEnum.EXCEPTION.toString(), "=", "NULL", String.class.getName()); @@ -106,7 +109,7 @@ public class SqlCreationUtil { String table = MetricsManager .getSystemTableFromSubject(KylinConfig.getInstanceFromEnv().getKylinMetricsSubjectJob()); - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); if (StringUtil.isEmpty(projectName)) { addFilter(filterMap, JobPropertyEnum.PROJECT.toString(), "<>", MetricsManager.SYSTEM_PROJECT, String.class.getName()); @@ -116,6 +119,7 @@ public class SqlCreationUtil { } if (!StringUtil.isEmpty(cubeName)) { addFilter(filterMap, JobPropertyEnum.CUBE.toString(), "IN", cubeName, String.class.getName()); + addCubeCreationUTCFilter(filterMap, cubeName); } addFilter(filterMap, TimePropertyEnum.DAY_DATE.toString(), ">=", startTime, String.class.getName()); @@ -136,8 +140,9 @@ public class SqlCreationUtil { String[] measures = new String[1]; measures[0] = "sum(" + QueryCubePropertyEnum.WEIGHT_PER_HIT.toString() + ")"; - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); addFilter(filterMap, QueryCubePropertyEnum.CUBE.toString(), "=", cubeName, String.class.getName()); + addCubeCreationUTCFilter(filterMap, cubeName); return createPrepareSqlRequest(table, dimensions, measures, filterMap); } @@ -154,8 +159,9 @@ public class SqlCreationUtil { measures[0] = "avg(" + QueryCubePropertyEnum.AGGR_COUNT.toString() + ")"; measures[1] = "avg(" + QueryCubePropertyEnum.RETURN_COUNT.toString() + ")"; - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); addFilter(filterMap, QueryCubePropertyEnum.CUBE.toString(), "=", cubeName, String.class.getName()); + addCubeCreationUTCFilter(filterMap, cubeName); return createPrepareSqlRequest(table, dimensions, measures, filterMap); } @@ -170,8 +176,9 @@ public class SqlCreationUtil { String[] measures = new String[1]; measures[0] = "sum(" + QueryCubePropertyEnum.WEIGHT_PER_HIT.toString() + ")"; - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); addFilter(filterMap, QueryCubePropertyEnum.CUBE.toString(), "=", cubeName, String.class.getName()); + addCubeCreationUTCFilter(filterMap, cubeName); addFilter(filterMap, QueryCubePropertyEnum.IF_MATCH.toString(), "=", "true", Boolean.class.getName()); return createPrepareSqlRequest(table, dimensions, measures, filterMap); @@ -189,8 +196,9 @@ public class SqlCreationUtil { String[] measures = new String[1]; measures[0] = "avg(" + QueryPropertyEnum.TIME_COST.toString() + ") as query_latency"; - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); addFilter(filterMap, QueryPropertyEnum.REALIZATION.toString(), "=", cube.getName(), String.class.getName()); + addCubeCreationUTCFilter(filterMap, cube.getName()); return createPrepareSqlRequest(table, dimensions, measures, filterMap, groupBys, groupBys); } @@ -207,8 +215,9 @@ public class SqlCreationUtil { String[] measures = new String[1]; measures[0] = getExpansionRateMetric() + " as expansion_rate"; - Map<String, StateParam> filterMap = Maps.newHashMap(); + Map<String, List<StateParam>> filterMap = Maps.newHashMap(); addFilter(filterMap, JobPropertyEnum.CUBE.toString(), "=", cube.getName(), String.class.getName()); + addCubeCreationUTCFilter(filterMap, cube.getName()); return createPrepareSqlRequest(table, dimensions, measures, filterMap, groupBys, groupBys); } @@ -246,12 +255,12 @@ public class SqlCreationUtil { } private static PrepareSqlRequest createPrepareSqlRequest(String table, String[] dimensions, String[] measures, - Map<String, StateParam> filterMap) { + Map<String, List<StateParam>> filterMap) { return createPrepareSqlRequest(table, dimensions, measures, filterMap, dimensions, null); } private static PrepareSqlRequest createPrepareSqlRequest(String table, String[] dimensions, String[] measures, - Map<String, StateParam> filterMap, String[] groupBys, String[] orderBys) { + Map<String, List<StateParam>> filterMap, String[] groupBys, String[] orderBys) { PrepareSqlRequest sqlRequest = new PrepareSqlRequest(); sqlRequest.setProject(MetricsManager.SYSTEM_PROJECT); @@ -262,12 +271,12 @@ public class SqlCreationUtil { String filterPart = ""; if (filterMap != null && !filterMap.isEmpty()) { - List<Map.Entry<String, StateParam>> filterList = Lists.newArrayList(filterMap.entrySet()); + List<Map.Entry<String, List<StateParam>>> filterList = Lists.newArrayList(filterMap.entrySet()); filterPart = filterList.stream().map(Map.Entry::getKey).collect(Collectors.joining(" and ")); - StateParam[] params = filterList.stream().map(Map.Entry::getValue).collect(Collectors.toList()) - .toArray(new StateParam[filterMap.size()]); + StateParam[] params = filterList.stream().map(Map.Entry::getValue).flatMap(Collection::stream) + .toArray(StateParam[]::new); sqlRequest.setParams(params); } @@ -304,13 +313,58 @@ public class SqlCreationUtil { return elements != null && elements.length > 0 ? StringUtil.join(Arrays.asList(elements), ", ") : ""; } - private static void addFilter(Map<String, StateParam> filterMap, String keyName, String compareSign, String value, - String className) { + private static void addCubeCreationUTCFilter(Map<String, List<StateParam>> filterMap, String cubeName) { + CubeManager cubeManager = CubeManager.getInstance(KylinConfig.getInstanceFromEnv()); + CubeInstance cubeInstance = cubeManager.getCube(cubeName); + if (cubeInstance != null) { + RecordEventTimeDetail dateDetail = new RecordEventTimeDetail(cubeInstance.getCreateTimeUTC()); + + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(TimePropertyEnum.DAY_DATE.toString() + " > ?"); + sb.append(" or "); + sb.append("("); + sb.append(TimePropertyEnum.DAY_DATE.toString() + " = ?"); + sb.append(" and "); + sb.append("("); + sb.append(TimePropertyEnum.TIME_HOUR.toString() + " > ?"); + sb.append(" or "); + sb.append("("); + sb.append(TimePropertyEnum.TIME_HOUR.toString() + " = ?"); + sb.append(" and "); + sb.append(TimePropertyEnum.TIME_MINUTE.toString() + " >= ?"); + sb.append(")"); + sb.append(")"); + sb.append(")"); + sb.append(")"); + String key = sb.toString(); + + StateParam dayParam = new StateParam(); + dayParam.setClassName(String.class.getName()); + dayParam.setValue(dateDetail.date); + + StateParam hourParam = new StateParam(); + hourParam.setClassName(Integer.class.getName()); + hourParam.setValue(String.valueOf(dateDetail.hour)); + + StateParam minuteParam = new StateParam(); + minuteParam.setClassName(Integer.class.getName()); + minuteParam.setValue(String.valueOf(dateDetail.minute)); + + List<StateParam> value = Lists.newArrayList(dayParam, dayParam, hourParam, hourParam, minuteParam); + + filterMap.put(key, value); + } + } + + private static void addFilter(Map<String, List<StateParam>> filterMap, String keyName, String compareSign, + String value, String className) { StateParam stateParam = new StateParam(); stateParam.setClassName(className); stateParam.setValue(value); String mark = compareSign.equalsIgnoreCase("IN") ? "(?)" : "?"; - filterMap.put(String.format(Locale.ROOT, "%s %s %s", keyName, compareSign, mark), stateParam); + filterMap.put(String.format(Locale.ROOT, "%s %s %s", keyName, compareSign, mark), + Lists.newArrayList(stateParam)); } private enum CategoryEnum {