http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/examples/test_case_data/localmeta/cube_desc/ci_left_join_cube.json ---------------------------------------------------------------------- diff --git a/examples/test_case_data/localmeta/cube_desc/ci_left_join_cube.json b/examples/test_case_data/localmeta/cube_desc/ci_left_join_cube.json index 221ffb6..cbf7a76 100644 --- a/examples/test_case_data/localmeta/cube_desc/ci_left_join_cube.json +++ b/examples/test_case_data/localmeta/cube_desc/ci_left_join_cube.json @@ -1,455 +1,627 @@ { - "uuid" : "629ab7a8-3929-4dff-b59d-2100aadccd1a", - "name" : "ci_left_join_cube", - "model_name" : "ci_left_join_model", - "description" : null, - "dimensions" : [ { - "name" : "CAL_DT", - "table" : "TEST_CAL_DT", - "column" : "{FK}", - "derived" : [ "WEEK_BEG_DT" ] - }, { - "name" : "ORDER_ID", - "table" : "TEST_KYLIN_FACT", - "column" : "ORDER_ID" - }, { - "name" : "TEST_DATE_ENC", - "table" : "TEST_ORDER", - "column" : "TEST_DATE_ENC" - }, { - "name" : "TEST_TIME_ENC", - "table" : "TEST_ORDER", - "column" : "TEST_TIME_ENC" - }, { - "name" : "CATEGORY", - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : "{FK}", - "derived" : [ "USER_DEFINED_FIELD1", "USER_DEFINED_FIELD3", "UPD_DATE", "UPD_USER" ] - }, { - "name" : "CATEGORY_HIERARCHY", - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : "META_CATEG_NAME", - "derived" : null - }, { - "name" : "CATEGORY_HIERARCHY", - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : "CATEG_LVL2_NAME", - "derived" : null - }, { - "name" : "CATEGORY_HIERARCHY", - "table" : "TEST_CATEGORY_GROUPINGS", - "column" : "CATEG_LVL3_NAME", - "derived" : null - }, { - "name" : "LSTG_FORMAT_NAME", - "table" : "TEST_KYLIN_FACT", - "column" : "LSTG_FORMAT_NAME", - "derived" : null - }, { - "name" : "SITE_ID", - "table" : "TEST_SITES", - "column" : "{FK}", - "derived" : [ "SITE_NAME", "CRE_USER" ] - }, { - "name" : "SELLER_TYPE_CD", - "table" : "TEST_SELLER_TYPE_DIM", - "column" : "{FK}", - "derived" : [ "SELLER_TYPE_DESC" ] - }, { - "name" : "SELLER_ID", - "table" : "TEST_KYLIN_FACT", - "column" : "SELLER_ID" - }, { - "name" : "SELLER_BUYER_LEVEL", - "table" : "SELLER_ACCOUNT", - "column" : "ACCOUNT_BUYER_LEVEL" - }, { - "name" : "SELLER_SELLER_LEVEL", - "table" : "SELLER_ACCOUNT", - "column" : "ACCOUNT_SELLER_LEVEL" - }, { - "name" : "SELLER_COUNTRY", - "table" : "SELLER_ACCOUNT", - "column" : "ACCOUNT_COUNTRY" - }, { - "name" : "SELLER_COUNTRY_NAME", - "table" : "SELLER_COUNTRY", - "column" : "NAME" - }, { - "name" : "BUYER_ID", - "table" : "TEST_ORDER", - "column" : "BUYER_ID" - }, { - "name" : "BUYER_BUYER_LEVEL", - "table" : "BUYER_ACCOUNT", - "column" : "ACCOUNT_BUYER_LEVEL" - }, { - "name" : "BUYER_SELLER_LEVEL", - "table" : "BUYER_ACCOUNT", - "column" : "ACCOUNT_SELLER_LEVEL" - }, { - "name" : "BUYER_COUNTRY", - "table" : "BUYER_ACCOUNT", - "column" : "ACCOUNT_COUNTRY" - }, { - "name" : "BUYER_COUNTRY_NAME", - "table" : "BUYER_COUNTRY", - "column" : "NAME" - } ], - "measures" : [ { - "name" : "TRANS_CNT", - "function" : { - "expression" : "COUNT", - "parameter" : { - "type" : "constant", - "value" : "1" - }, - "returntype" : "bigint" + "uuid": "629ab7a8-3929-4dff-b59d-2100aadccd1a", + "name": "ci_left_join_cube", + "model_name": "ci_left_join_model", + "description": null, + "dimensions": [ + { + "name": "CAL_DT", + "table": "TEST_CAL_DT", + "column": "{FK}", + "derived": [ + "WEEK_BEG_DT" + ] + }, + { + "name": "ORDER_ID", + "table": "TEST_KYLIN_FACT", + "column": "ORDER_ID" + }, + { + "name": "TEST_DATE_ENC", + "table": "TEST_ORDER", + "column": "TEST_DATE_ENC" + }, + { + "name": "TEST_TIME_ENC", + "table": "TEST_ORDER", + "column": "TEST_TIME_ENC" + }, + { + "name": "CATEGORY", + "table": "TEST_CATEGORY_GROUPINGS", + "column": "{FK}", + "derived": [ + "USER_DEFINED_FIELD1", + "USER_DEFINED_FIELD3", + "UPD_DATE", + "UPD_USER" + ] + }, + { + "name": "CATEGORY_HIERARCHY", + "table": "TEST_CATEGORY_GROUPINGS", + "column": "META_CATEG_NAME", + "derived": null + }, + { + "name": "CATEGORY_HIERARCHY", + "table": "TEST_CATEGORY_GROUPINGS", + "column": "CATEG_LVL2_NAME", + "derived": null + }, + { + "name": "CATEGORY_HIERARCHY", + "table": "TEST_CATEGORY_GROUPINGS", + "column": "CATEG_LVL3_NAME", + "derived": null + }, + { + "name": "LSTG_FORMAT_NAME", + "table": "TEST_KYLIN_FACT", + "column": "LSTG_FORMAT_NAME", + "derived": null + }, + { + "name": "SITE_ID", + "table": "TEST_SITES", + "column": "{FK}", + "derived": [ + "SITE_NAME", + "CRE_USER" + ] + }, + { + "name": "SELLER_TYPE_CD", + "table": "TEST_SELLER_TYPE_DIM", + "column": "{FK}", + "derived": [ + "SELLER_TYPE_DESC" + ] + }, + { + "name": "SELLER_ID", + "table": "TEST_KYLIN_FACT", + "column": "SELLER_ID" + }, + { + "name": "SELLER_BUYER_LEVEL", + "table": "SELLER_ACCOUNT", + "column": "ACCOUNT_BUYER_LEVEL" + }, + { + "name": "SELLER_SELLER_LEVEL", + "table": "SELLER_ACCOUNT", + "column": "ACCOUNT_SELLER_LEVEL" + }, + { + "name": "SELLER_COUNTRY", + "table": "SELLER_ACCOUNT", + "column": "ACCOUNT_COUNTRY" + }, + { + "name": "SELLER_COUNTRY_NAME", + "table": "SELLER_COUNTRY", + "column": "NAME" + }, + { + "name": "BUYER_ID", + "table": "TEST_ORDER", + "column": "BUYER_ID" + }, + { + "name": "BUYER_BUYER_LEVEL", + "table": "BUYER_ACCOUNT", + "column": "ACCOUNT_BUYER_LEVEL" + }, + { + "name": "BUYER_SELLER_LEVEL", + "table": "BUYER_ACCOUNT", + "column": "ACCOUNT_SELLER_LEVEL" + }, + { + "name": "BUYER_COUNTRY", + "table": "BUYER_ACCOUNT", + "column": "ACCOUNT_COUNTRY" + }, + { + "name": "DEAL_YEAR", + "table": "TEST_KYLIN_FACT", + "column": "DEAL_YEAR" + }, + { + "name": "SELLER_COUNTRY_ABBR", + "table": "SELLER_ACCOUNT", + "column": "COUNTRY_ABBR" + }, + { + "name": "BUYER_COUNTRY_ABBR", + "table": "BUYER_ACCOUNT", + "column": "COUNTRY_ABBR" + }, + { + "name": "BUYER_COUNTRY_NAME", + "table": "BUYER_COUNTRY", + "column": "NAME" } - }, { - "name" : "ITEM_COUNT_SUM", - "function" : { - "expression" : "SUM", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.ITEM_COUNT" - }, - "returntype" : "bigint" + ], + "measures": [ + { + "name": "TRANS_CNT", + "function": { + "expression": "COUNT", + "parameter": { + "type": "constant", + "value": "1" + }, + "returntype": "bigint" + } + }, + { + "name": "ITEM_COUNT_SUM", + "function": { + "expression": "SUM", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.ITEM_COUNT" + }, + "returntype": "bigint" + } + }, + { + "name": "GMV_SUM", + "function": { + "expression": "SUM", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.PRICE" + }, + "returntype": "decimal(19,4)" + } + }, + { + "name": "GMV_MIN", + "function": { + "expression": "MIN", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.PRICE" + }, + "returntype": "decimal(19,4)" + } + }, + { + "name": "GMV_MAX", + "function": { + "expression": "MAX", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.PRICE" + }, + "returntype": "decimal(19,4)" + } + }, + { + "name": "SELLER_HLL", + "function": { + "expression": "COUNT_DISTINCT", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.SELLER_ID" + }, + "returntype": "hllc(10)" + } + }, + { + "name": "SELLER_FORMAT_HLL", + "function": { + "expression": "COUNT_DISTINCT", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", + "next_parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.SELLER_ID" + } + }, + "returntype": "hllc(10)" + } + }, + { + "name": "TOP_SELLER", + "function": { + "expression": "TOP_N", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.PRICE", + "next_parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.SELLER_ID" + } + }, + "returntype": "topn(100, 4)", + "configuration": { + "topn.encoding.TEST_KYLIN_FACT.SELLER_ID": "int:4" + } + } + }, + { + "name": "TEST_COUNT_DISTINCT_BITMAP", + "function": { + "expression": "COUNT_DISTINCT", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.TEST_COUNT_DISTINCT_BITMAP" + }, + "returntype": "bitmap" + } + }, + { + "name": "TEST_EXTENDED_COLUMN", + "function": { + "expression": "EXTENDED_COLUMN", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.ORDER_ID", + "next_parameter": { + "type": "column", + "value": "TEST_ORDER.TEST_EXTENDED_COLUMN" + } + }, + "returntype": "extendedcolumn(100)" + } + }, + { + "name": "BUYER_CONTACT", + "function": { + "expression": "EXTENDED_COLUMN", + "parameter": { + "type": "column", + "value": "TEST_ORDER.BUYER_ID", + "next_parameter": { + "type": "column", + "value": "BUYER_ACCOUNT.ACCOUNT_CONTACT" + } + }, + "returntype": "extendedcolumn(100)" + } + }, + { + "name": "SELLER_CONTACT", + "function": { + "expression": "EXTENDED_COLUMN", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.SELLER_ID", + "next_parameter": { + "type": "column", + "value": "SELLER_ACCOUNT.ACCOUNT_CONTACT" + } + }, + "returntype": "extendedcolumn(100)" + } + }, + { + "name": "TRANS_ID_RAW", + "function": { + "expression": "RAW", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.TRANS_ID" + }, + "returntype": "raw" + } + }, + { + "name": "PRICE_RAW", + "function": { + "expression": "RAW", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.PRICE" + }, + "returntype": "raw" + } + }, + { + "name": "CAL_DT_RAW", + "function": { + "expression": "RAW", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.CAL_DT" + }, + "returntype": "raw" + } + }, + { + "name": "GVM_PERCENTILE", + "function": { + "expression": "PERCENTILE", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.PRICE" + }, + "returntype": "percentile(100)" + } + }, + { + "name": "COMPUTED_COLUMN_MEASURE", + "function": { + "expression": "SUM", + "parameter": { + "type": "column", + "value": "TEST_KYLIN_FACT.DEAL_AMOUNT" + }, + "returntype": "decimal" + } } - }, { - "name" : "GMV_SUM", - "function" : { - "expression" : "SUM", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.PRICE" - }, - "returntype" : "decimal(19,4)" + ], + "dictionaries": [ + { + "column": "TEST_KYLIN_FACT.TEST_COUNT_DISTINCT_BITMAP", + "builder": "org.apache.kylin.dict.GlobalDictionaryBuilder" } - }, { - "name" : "GMV_MIN", - "function" : { - "expression" : "MIN", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.PRICE" + ], + "rowkey": { + "rowkey_columns": [ + { + "column": "TEST_KYLIN_FACT.SELLER_ID", + "encoding": "int:4" }, - "returntype" : "decimal(19,4)" - } - }, { - "name" : "GMV_MAX", - "function" : { - "expression" : "MAX", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.PRICE" + { + "column": "TEST_KYLIN_FACT.ORDER_ID", + "encoding": "int:4" }, - "returntype" : "decimal(19,4)" - } - }, { - "name" : "SELLER_HLL", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.SELLER_ID" + { + "column": "TEST_KYLIN_FACT.CAL_DT", + "encoding": "dict" }, - "returntype" : "hllc(10)" - } - }, { - "name" : "SELLER_FORMAT_HLL", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", - "next_parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.SELLER_ID" - } + { + "column": "TEST_KYLIN_FACT.LEAF_CATEG_ID", + "encoding": "dict" }, - "returntype" : "hllc(10)" - } - }, { - "name" : "TOP_SELLER", - "function" : { - "expression" : "TOP_N", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.PRICE", - "next_parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.SELLER_ID" - } + { + "column": "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", + "encoding": "dict" }, - "returntype" : "topn(100, 4)", - "configuration": {"topn.encoding.TEST_KYLIN_FACT.SELLER_ID" : "int:4"} - } - }, { - "name" : "TEST_COUNT_DISTINCT_BITMAP", - "function" : { - "expression" : "COUNT_DISTINCT", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.TEST_COUNT_DISTINCT_BITMAP" + { + "column": "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", + "encoding": "dict" }, - "returntype" : "bitmap" - } - }, { - "name" : "TEST_EXTENDED_COLUMN", - "function" : { - "expression" : "EXTENDED_COLUMN", - "parameter": { - "type": "column", - "value": "TEST_KYLIN_FACT.ORDER_ID", - "next_parameter": { - "type": "column", - "value": "TEST_ORDER.TEST_EXTENDED_COLUMN" - } + { + "column": "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", + "encoding": "dict" }, - "returntype": "extendedcolumn(100)" - } - }, { - "name" : "BUYER_CONTACT", - "function" : { - "expression" : "EXTENDED_COLUMN", - "parameter": { - "type": "column", - "value": "TEST_ORDER.BUYER_ID", - "next_parameter": { - "type": "column", - "value": "BUYER_ACCOUNT.ACCOUNT_CONTACT" - } + { + "column": "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", + "encoding": "fixed_length:12" }, - "returntype": "extendedcolumn(100)" - } - }, { - "name" : "SELLER_CONTACT", - "function" : { - "expression" : "EXTENDED_COLUMN", - "parameter": { - "type": "column", - "value": "TEST_KYLIN_FACT.SELLER_ID", - "next_parameter": { - "type": "column", - "value": "SELLER_ACCOUNT.ACCOUNT_CONTACT" - } + { + "column": "TEST_KYLIN_FACT.LSTG_SITE_ID", + "encoding": "dict" }, - "returntype": "extendedcolumn(100)" - } - }, { - "name" : "TRANS_ID_RAW", - "function" : { - "expression" : "RAW", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.TRANS_ID" + { + "column": "TEST_KYLIN_FACT.SLR_SEGMENT_CD", + "encoding": "dict" }, - "returntype" : "raw" - } - }, { - "name" : "PRICE_RAW", - "function" : { - "expression" : "RAW", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.PRICE" + { + "column": "TEST_ORDER.TEST_TIME_ENC", + "encoding": "time" }, - "returntype" : "raw" - } - }, { - "name" : "CAL_DT_RAW", - "function" : { - "expression" : "RAW", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.CAL_DT" + { + "column": "TEST_ORDER.TEST_DATE_ENC", + "encoding": "date" }, - "returntype" : "raw" - } - }, { - "name" : "GVM_PERCENTILE", - "function" : { - "expression" : "PERCENTILE", - "parameter" : { - "type" : "column", - "value" : "TEST_KYLIN_FACT.PRICE" + { + "column": "TEST_ORDER.BUYER_ID", + "encoding": "int:4" }, - "returntype" : "percentile(100)" - } - } ], - "dictionaries": [ { - "column": "TEST_KYLIN_FACT.TEST_COUNT_DISTINCT_BITMAP", - "builder": "org.apache.kylin.dict.GlobalDictionaryBuilder" - } ], - "rowkey" : { - "rowkey_columns" : [ { - "column" : "TEST_KYLIN_FACT.SELLER_ID", - "encoding" : "int:4" - }, { - "column" : "TEST_KYLIN_FACT.ORDER_ID", - "encoding" : "int:4" - }, { - "column" : "TEST_KYLIN_FACT.CAL_DT", - "encoding" : "dict" - }, { - "column" : "TEST_KYLIN_FACT.LEAF_CATEG_ID", - "encoding" : "dict" - }, { - "column" : "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", - "encoding" : "dict" - }, { - "column" : "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", - "encoding" : "dict" - }, { - "column" : "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", - "encoding" : "dict" - }, { - "column" : "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", - "encoding" : "fixed_length:12" - }, { - "column" : "TEST_KYLIN_FACT.LSTG_SITE_ID", - "encoding" : "dict" - }, { - "column" : "TEST_KYLIN_FACT.SLR_SEGMENT_CD", - "encoding" : "dict" - }, { - "column" : "TEST_ORDER.TEST_TIME_ENC", - "encoding" : "time" - }, { - "column" : "TEST_ORDER.TEST_DATE_ENC", - "encoding" : "date" - }, { - "column" : "TEST_ORDER.BUYER_ID", - "encoding" : "int:4" - }, { - "column" : "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", - "encoding" : "dict" - }, { - "column" : "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", - "encoding" : "dict" - }, { - "column" : "BUYER_ACCOUNT.ACCOUNT_COUNTRY", - "encoding" : "dict" - }, { - "column" : "BUYER_COUNTRY.NAME", - "encoding" : "dict" - }, { - "column" : "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL", - "encoding" : "dict" - }, { - "column" : "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL", - "encoding" : "dict" - }, { - "column" : "SELLER_ACCOUNT.ACCOUNT_COUNTRY", - "encoding" : "dict" - }, { - "column" : "SELLER_COUNTRY.NAME", - "encoding" : "dict" - } ] + { + "column": "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", + "encoding": "dict" + }, + { + "column": "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", + "encoding": "dict" + }, + { + "column": "BUYER_ACCOUNT.ACCOUNT_COUNTRY", + "encoding": "dict" + }, + { + "column": "BUYER_COUNTRY.NAME", + "encoding": "dict" + }, + { + "column": "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL", + "encoding": "dict" + }, + { + "column": "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL", + "encoding": "dict" + }, + { + "column": "SELLER_ACCOUNT.ACCOUNT_COUNTRY", + "encoding": "dict" + }, + { + "column": "TEST_KYLIN_FACT.DEAL_YEAR", + "encoding": "int:2" + }, + { + "column": "SELLER_COUNTRY.NAME", + "encoding": "dict" + }, + { + "column": "SELLER_ACCOUNT.COUNTRY_ABBR", + "encoding": "dict" + }, + { + "column": "BUYER_ACCOUNT.COUNTRY_ABBR", + "encoding": "dict" + } + ] }, - "signature" : null, - "last_modified" : 1448959801311, - "null_string" : null, - "hbase_mapping" : { - "column_family" : [ { - "name" : "f1", - "columns" : [ { - "qualifier" : "m", - "measure_refs" : [ "TRANS_CNT", "ITEM_COUNT_SUM", "GMV_SUM", "GMV_MIN", "GMV_MAX" ] - } ] - }, { - "name" : "f2", - "columns" : [ { - "qualifier" : "m", - "measure_refs" : [ "SELLER_HLL", "SELLER_FORMAT_HLL", "TOP_SELLER", "TEST_COUNT_DISTINCT_BITMAP" ] - } ] - }, { - "name" : "f3", - "columns" : [ { - "qualifier" : "m", - "measure_refs" : [ "TEST_EXTENDED_COLUMN", "TRANS_ID_RAW", "PRICE_RAW", "CAL_DT_RAW", "BUYER_CONTACT", "SELLER_CONTACT", "GVM_PERCENTILE" ] - } ] - } ] + "signature": null, + "last_modified": 1448959801311, + "null_string": null, + "hbase_mapping": { + "column_family": [ + { + "name": "f1", + "columns": [ + { + "qualifier": "m", + "measure_refs": [ + "TRANS_CNT", + "ITEM_COUNT_SUM", + "GMV_SUM", + "GMV_MIN", + "GMV_MAX", + "COMPUTED_COLUMN_MEASURE" + ] + } + ] + }, + { + "name": "f2", + "columns": [ + { + "qualifier": "m", + "measure_refs": [ + "SELLER_HLL", + "SELLER_FORMAT_HLL", + "TOP_SELLER", + "TEST_COUNT_DISTINCT_BITMAP" + ] + } + ] + }, + { + "name": "f3", + "columns": [ + { + "qualifier": "m", + "measure_refs": [ + "TEST_EXTENDED_COLUMN", + "TRANS_ID_RAW", + "PRICE_RAW", + "CAL_DT_RAW", + "BUYER_CONTACT", + "SELLER_CONTACT", + "GVM_PERCENTILE" + ] + } + ] + } + ] }, - "aggregation_groups" : [ { - "includes" : [ "TEST_KYLIN_FACT.CAL_DT", - "TEST_KYLIN_FACT.LEAF_CATEG_ID", - "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", - "TEST_KYLIN_FACT.LSTG_SITE_ID", - "TEST_KYLIN_FACT.SLR_SEGMENT_CD", - "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME" ], - "select_rule" : { - "hierarchy_dims" : [ [ "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", - "TEST_KYLIN_FACT.LEAF_CATEG_ID" ] ], - "mandatory_dims" : [ ], - "joint_dims" : [ [ "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", - "TEST_KYLIN_FACT.LSTG_SITE_ID", - "TEST_KYLIN_FACT.SLR_SEGMENT_CD" ] ] - } - }, { - "includes" : [ "TEST_KYLIN_FACT.CAL_DT", - "TEST_KYLIN_FACT.LEAF_CATEG_ID", - "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", - "TEST_KYLIN_FACT.LSTG_SITE_ID", - "TEST_KYLIN_FACT.SLR_SEGMENT_CD", - "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", - - "TEST_KYLIN_FACT.SELLER_ID", - "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL", - "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL", - "SELLER_ACCOUNT.ACCOUNT_COUNTRY", - "SELLER_COUNTRY.NAME", - - "TEST_KYLIN_FACT.ORDER_ID", - "TEST_ORDER.TEST_DATE_ENC", - "TEST_ORDER.TEST_TIME_ENC", - "TEST_ORDER.BUYER_ID", - "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", - "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", - "BUYER_ACCOUNT.ACCOUNT_COUNTRY", - "BUYER_COUNTRY.NAME" ], - "select_rule" : { - "hierarchy_dims" : [ ], - "mandatory_dims" : [ "TEST_KYLIN_FACT.CAL_DT" ], - - "joint_dims" : [ [ "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", - "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", - "TEST_KYLIN_FACT.LEAF_CATEG_ID" ], - - [ "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", - "TEST_KYLIN_FACT.LSTG_SITE_ID", - "TEST_KYLIN_FACT.SLR_SEGMENT_CD" ], - - [ "TEST_KYLIN_FACT.SELLER_ID", - "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL", - "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL", - "SELLER_ACCOUNT.ACCOUNT_COUNTRY", - "SELLER_COUNTRY.NAME" ], - - [ "TEST_KYLIN_FACT.ORDER_ID", - "TEST_ORDER.TEST_DATE_ENC", - "TEST_ORDER.TEST_TIME_ENC", - "TEST_ORDER.BUYER_ID", - "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", - "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", - "BUYER_ACCOUNT.ACCOUNT_COUNTRY", - "BUYER_COUNTRY.NAME" ] ] + "aggregation_groups": [ + { + "includes": [ + "TEST_KYLIN_FACT.CAL_DT", + "TEST_KYLIN_FACT.LEAF_CATEG_ID", + "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", + "TEST_KYLIN_FACT.LSTG_SITE_ID", + "TEST_KYLIN_FACT.SLR_SEGMENT_CD", + "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", + "TEST_KYLIN_FACT.DEAL_YEAR" + ], + "select_rule": { + "hierarchy_dims": [ + [ + "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", + "TEST_KYLIN_FACT.LEAF_CATEG_ID" + ] + ], + "mandatory_dims": [], + "joint_dims": [ + [ + "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", + "TEST_KYLIN_FACT.LSTG_SITE_ID", + "TEST_KYLIN_FACT.SLR_SEGMENT_CD", + "TEST_KYLIN_FACT.DEAL_YEAR" + ] + ] + } + }, + { + "includes": [ + "TEST_KYLIN_FACT.CAL_DT", + "TEST_KYLIN_FACT.LEAF_CATEG_ID", + "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", + "TEST_KYLIN_FACT.LSTG_SITE_ID", + "TEST_KYLIN_FACT.SLR_SEGMENT_CD", + "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", + "TEST_KYLIN_FACT.SELLER_ID", + "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL", + "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL", + "SELLER_ACCOUNT.ACCOUNT_COUNTRY", + "SELLER_COUNTRY.NAME", + "TEST_KYLIN_FACT.ORDER_ID", + "TEST_ORDER.TEST_DATE_ENC", + "TEST_ORDER.TEST_TIME_ENC", + "TEST_ORDER.BUYER_ID", + "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", + "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", + "BUYER_ACCOUNT.ACCOUNT_COUNTRY", + "BUYER_COUNTRY.NAME", + "SELLER_ACCOUNT.COUNTRY_ABBR", + "BUYER_ACCOUNT.COUNTRY_ABBR" + ], + "select_rule": { + "hierarchy_dims": [], + "mandatory_dims": [ + "TEST_KYLIN_FACT.CAL_DT" + ], + "joint_dims": [ + [ + "TEST_CATEGORY_GROUPINGS.META_CATEG_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME", + "TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME", + "TEST_KYLIN_FACT.LEAF_CATEG_ID" + ], + [ + "TEST_KYLIN_FACT.LSTG_FORMAT_NAME", + "TEST_KYLIN_FACT.LSTG_SITE_ID", + "TEST_KYLIN_FACT.SLR_SEGMENT_CD", + "SELLER_ACCOUNT.COUNTRY_ABBR", + "BUYER_ACCOUNT.COUNTRY_ABBR" + ], + [ + "TEST_KYLIN_FACT.SELLER_ID", + "SELLER_ACCOUNT.ACCOUNT_BUYER_LEVEL", + "SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL", + "SELLER_ACCOUNT.ACCOUNT_COUNTRY", + "SELLER_COUNTRY.NAME" + ], + [ + "TEST_KYLIN_FACT.ORDER_ID", + "TEST_ORDER.TEST_DATE_ENC", + "TEST_ORDER.TEST_TIME_ENC", + "TEST_ORDER.BUYER_ID", + "BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL", + "BUYER_ACCOUNT.ACCOUNT_SELLER_LEVEL", + "BUYER_ACCOUNT.ACCOUNT_COUNTRY", + "BUYER_COUNTRY.NAME" + ] + ] + } } - } ], - "notify_list" : null, - "status_need_notify" : [ ], - "auto_merge_time_ranges" : null, - "retention_range" : 0, - "engine_type" : 2, - "storage_type" : 2, + ], + "notify_list": null, + "status_need_notify": [], + "auto_merge_time_ranges": null, + "retention_range": 0, + "engine_type": 2, + "storage_type": 2, "override_kylin_properties": { "kylin.cube.algorithm": "INMEM" },
http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/examples/test_case_data/localmeta/model_desc/ci_inner_join_model.json ---------------------------------------------------------------------- diff --git a/examples/test_case_data/localmeta/model_desc/ci_inner_join_model.json b/examples/test_case_data/localmeta/model_desc/ci_inner_join_model.json index b79d293..d084ce2 100644 --- a/examples/test_case_data/localmeta/model_desc/ci_inner_join_model.json +++ b/examples/test_case_data/localmeta/model_desc/ci_inner_join_model.json @@ -121,6 +121,29 @@ } } ], + "computed_columns": [ + { + "tableIdentity": "DEFAULT.TEST_KYLIN_FACT", + "columnName": "DEAL_AMOUNT", + "expression": "DEFAULT.TEST_KYLIN_FACT.PRICE * DEFAULT.TEST_KYLIN_FACT.ITEM_COUNT", + "datatype": "decimal", + "comment": "deal amount of inner join model" + }, + { + "tableIdentity": "DEFAULT.TEST_KYLIN_FACT", + "columnName": "DEAL_YEAR", + "expression": "year(DEFAULT.TEST_KYLIN_FACT.CAL_DT)", + "datatype": "integer", + "comment": "the year of the deal of the inner join model" + }, + { + "tableIdentity": "DEFAULT.TEST_ACCOUNT", + "columnName": "COUNTRY_ABBR", + "expression": "SUBSTR(DEFAULT.TEST_ACCOUNT.ACCOUNT_COUNTRY,0,1)", + "datatype": "string", + "comment": "first char of country of the inner join model" + } + ], "dimensions": [ { "table": "TEST_KYLIN_FACT", @@ -133,7 +156,8 @@ "LEAF_CATEG_ID", "SLR_SEGMENT_CD", "SELLER_ID", - "TEST_COUNT_DISTINCT_BITMAP" + "TEST_COUNT_DISTINCT_BITMAP", + "DEAL_YEAR" ] }, { @@ -153,7 +177,8 @@ "ACCOUNT_BUYER_LEVEL", "ACCOUNT_SELLER_LEVEL", "ACCOUNT_COUNTRY", - "ACCOUNT_CONTACT" + "ACCOUNT_CONTACT", + "COUNTRY_ABBR" ] }, { @@ -163,7 +188,8 @@ "ACCOUNT_BUYER_LEVEL", "ACCOUNT_SELLER_LEVEL", "ACCOUNT_COUNTRY", - "ACCOUNT_CONTACT" + "ACCOUNT_CONTACT", + "COUNTRY_ABBR" ] }, { @@ -219,7 +245,8 @@ ], "metrics": [ "TEST_KYLIN_FACT.PRICE", - "TEST_KYLIN_FACT.ITEM_COUNT" + "TEST_KYLIN_FACT.ITEM_COUNT", + "TEST_KYLIN_FACT.DEAL_AMOUNT" ], "last_modified": 1422435345352, "filter_condition": null, @@ -228,4 +255,4 @@ "partition_date_start": 0, "partition_type": "APPEND" } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/examples/test_case_data/localmeta/model_desc/ci_left_join_model.json ---------------------------------------------------------------------- diff --git a/examples/test_case_data/localmeta/model_desc/ci_left_join_model.json b/examples/test_case_data/localmeta/model_desc/ci_left_join_model.json index bc5b444..4a10899 100644 --- a/examples/test_case_data/localmeta/model_desc/ci_left_join_model.json +++ b/examples/test_case_data/localmeta/model_desc/ci_left_join_model.json @@ -121,6 +121,29 @@ } } ], + "computed_columns": [ + { + "tableIdentity": "DEFAULT.TEST_KYLIN_FACT", + "columnName": "DEAL_AMOUNT", + "expression": "DEFAULT.TEST_KYLIN_FACT.PRICE * DEFAULT.TEST_KYLIN_FACT.ITEM_COUNT", + "datatype": "decimal", + "comment": "deal amount of left join model" + }, + { + "tableIdentity": "DEFAULT.TEST_KYLIN_FACT", + "columnName": "DEAL_YEAR", + "expression": "year(DEFAULT.TEST_KYLIN_FACT.CAL_DT)", + "datatype": "integer", + "comment": "the year of the deal of the left join model" + }, + { + "tableIdentity": "DEFAULT.TEST_ACCOUNT", + "columnName": "COUNTRY_ABBR", + "expression": "SUBSTR(DEFAULT.TEST_ACCOUNT.ACCOUNT_COUNTRY,0,1)", + "datatype": "string", + "comment": "first char of country of the left join model" + } + ], "dimensions": [ { "table": "TEST_KYLIN_FACT", @@ -133,7 +156,8 @@ "LEAF_CATEG_ID", "SLR_SEGMENT_CD", "SELLER_ID", - "TEST_COUNT_DISTINCT_BITMAP" + "TEST_COUNT_DISTINCT_BITMAP", + "DEAL_YEAR" ] }, { @@ -153,7 +177,8 @@ "ACCOUNT_BUYER_LEVEL", "ACCOUNT_SELLER_LEVEL", "ACCOUNT_COUNTRY", - "ACCOUNT_CONTACT" + "ACCOUNT_CONTACT", + "COUNTRY_ABBR" ] }, { @@ -163,7 +188,8 @@ "ACCOUNT_BUYER_LEVEL", "ACCOUNT_SELLER_LEVEL", "ACCOUNT_COUNTRY", - "ACCOUNT_CONTACT" + "ACCOUNT_CONTACT", + "COUNTRY_ABBR" ] }, { @@ -219,7 +245,8 @@ ], "metrics": [ "TEST_KYLIN_FACT.PRICE", - "TEST_KYLIN_FACT.ITEM_COUNT" + "TEST_KYLIN_FACT.ITEM_COUNT", + "TEST_KYLIN_FACT.DEAL_AMOUNT" ], "last_modified": 1422435345352, "filter_condition": null, @@ -228,4 +255,4 @@ "partition_date_start": 0, "partition_type": "APPEND" } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/examples/test_case_data/sandbox/kylin.properties ---------------------------------------------------------------------- diff --git a/examples/test_case_data/sandbox/kylin.properties b/examples/test_case_data/sandbox/kylin.properties index 684b4dd..13474f9 100644 --- a/examples/test_case_data/sandbox/kylin.properties +++ b/examples/test_case_data/sandbox/kylin.properties @@ -25,7 +25,7 @@ kylin.server.mode=all kylin.storage.hbase.owner-tag=who...@kylin.apache.org # List of web servers in use, this enables one web server instance to sync up with other servers. -#kylin.server.cluster-servers=localhost:7070 +kylin.server.cluster-servers=localhost:7070 # Display timezone on UI,format like[GMT+N or GMT-N] kylin.web.timezone=GMT+8 http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/java/org/apache/kylin/query/CompareQueryBySuffix.java ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/java/org/apache/kylin/query/CompareQueryBySuffix.java b/kylin-it/src/test/java/org/apache/kylin/query/CompareQueryBySuffix.java new file mode 100644 index 0000000..2dbe6fd --- /dev/null +++ b/kylin-it/src/test/java/org/apache/kylin/query/CompareQueryBySuffix.java @@ -0,0 +1,37 @@ +/* + * 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.io.IOException; + +public class CompareQueryBySuffix implements ICompareQueryTranslator { + + public static CompareQueryBySuffix INSTANCE = new CompareQueryBySuffix(); + + @Override + public String transform(File f) { + File parentFile = f.getParentFile(); + File compareFile = new File(parentFile, f.getName() + ".compare"); + try { + return KylinTestBase.getTextFromFile(compareFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/java/org/apache/kylin/query/ICompareQueryTranslator.java ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/java/org/apache/kylin/query/ICompareQueryTranslator.java b/kylin-it/src/test/java/org/apache/kylin/query/ICompareQueryTranslator.java new file mode 100644 index 0000000..67473b1 --- /dev/null +++ b/kylin-it/src/test/java/org/apache/kylin/query/ICompareQueryTranslator.java @@ -0,0 +1,29 @@ +/* + * 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; + +public interface ICompareQueryTranslator { + /** + * + * @param f origin query file + * @return the compare query to submit to standard DB like H2 + */ + public String transform(File f); +} http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java b/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java index cdaa10b..629e861 100644 --- a/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java +++ b/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java @@ -235,6 +235,11 @@ public class ITKylinQueryTest extends KylinTestBase { } @Test + public void testComputedColumnsQuery() throws Exception { + execAndCompQuery(getQueryFolderPrefix() + "src/test/resources/query/sql_computedcolumn", null, true, CompareQueryBySuffix.INSTANCE); + } + + @Test public void testTopNQuery() throws Exception { if ("left".equalsIgnoreCase(joinType)) { this.execAndCompQuery(getQueryFolderPrefix() + "src/test/resources/query/sql_topn", null, true); http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java b/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java index fad7a94..656666f 100644 --- a/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java +++ b/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java @@ -160,7 +160,7 @@ public class KylinTestBase { return new ArrayList<>(set); } - protected static String getTextFromFile(File file) throws IOException { + public static String getTextFromFile(File file) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(file)); String line = null; StringBuilder stringBuilder = new StringBuilder(); @@ -497,7 +497,21 @@ public class KylinTestBase { logger.info("Queries appended with limit: " + appendLimitQueries); } + protected void execAndCompQuery(String queryFolder, String[] exclusiveQuerys, boolean needSort) throws Exception { + execAndCompQuery(queryFolder, exclusiveQuerys, needSort, new ICompareQueryTranslator() { + @Override + public String transform(File f) { + try { + return KylinTestBase.getTextFromFile(f); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + } + + protected void execAndCompQuery(String queryFolder, String[] exclusiveQuerys, boolean needSort, ICompareQueryTranslator translator) throws Exception { logger.info("---------- test folder: " + new File(queryFolder).getAbsolutePath()); Set<String> exclusiveSet = buildExclusiveSet(exclusiveQuerys); @@ -507,17 +521,18 @@ public class KylinTestBase { if (exclusiveSet.contains(queryName)) { continue; } - String sql = getTextFromFile(sqlFile); + String sql1 = getTextFromFile(sqlFile); + String sql2 = translator.transform(sqlFile); // execute Kylin logger.info("Query Result from Kylin - " + queryName + " (" + queryFolder + ")"); IDatabaseConnection kylinConn = new DatabaseConnection(cubeConnection); - ITable kylinTable = executeQuery(kylinConn, queryName, sql, needSort); + ITable kylinTable = executeQuery(kylinConn, queryName, sql1, needSort); // execute H2 logger.info("Query Result from H2 - " + queryName); long currentTime = System.currentTimeMillis(); - ITable h2Table = executeQuery(newH2Connection(), queryName, sql, needSort); + ITable h2Table = executeQuery(newH2Connection(), queryName, sql2, needSort); logger.info("H2 spent " + (System.currentTimeMillis() - currentTime) + " mili-seconds."); try { @@ -530,7 +545,7 @@ public class KylinTestBase { compQueryCount++; if (kylinTable.getRowCount() == 0) { - zeroResultQueries.add(sql); + zeroResultQueries.add(sql1); } } } http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql b/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql new file mode 100644 index 0000000..5661c79 --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql @@ -0,0 +1,14 @@ +SELECT + +count(*) as cnt, sum(price) as sum_price, sum(DEAL_AMOUNT) as deal_amount, SELLER_COUNTRY.NAME, DEAL_YEAR as deal_year + +FROM TEST_KYLIN_FACT as TEST_KYLIN_FACT +INNER JOIN TEST_ACCOUNT as SELLER_ACCOUNT +ON TEST_KYLIN_FACT.SELLER_ID = SELLER_ACCOUNT.ACCOUNT_ID +INNER JOIN TEST_CATEGORY_GROUPINGS as TEST_CATEGORY_GROUPINGS +ON TEST_KYLIN_FACT.LEAF_CATEG_ID = TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_CATEGORY_GROUPINGS.SITE_ID +INNER JOIN TEST_COUNTRY as SELLER_COUNTRY +ON SELLER_ACCOUNT.ACCOUNT_COUNTRY = SELLER_COUNTRY.COUNTRY + +where SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL=1 and SELLER_ACCOUNT.COUNTRY_ABBR in ('I', 'F') +group by SELLER_COUNTRY.NAME, DEAL_YEAR http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql.compare ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql.compare b/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql.compare new file mode 100644 index 0000000..3f21647 --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_computedcolumn/query01.sql.compare @@ -0,0 +1,14 @@ +SELECT + +count(*) as cnt, sum(price) as sum_price, sum(TEST_KYLIN_FACT.PRICE * TEST_KYLIN_FACT.ITEM_COUNT) as deal_amount, SELLER_COUNTRY.NAME, year(TEST_KYLIN_FACT.CAL_DT) as deal_year + +FROM TEST_KYLIN_FACT as TEST_KYLIN_FACT +INNER JOIN TEST_ACCOUNT as SELLER_ACCOUNT +ON TEST_KYLIN_FACT.SELLER_ID = SELLER_ACCOUNT.ACCOUNT_ID +INNER JOIN TEST_CATEGORY_GROUPINGS as TEST_CATEGORY_GROUPINGS +ON TEST_KYLIN_FACT.LEAF_CATEG_ID = TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_CATEGORY_GROUPINGS.SITE_ID +INNER JOIN TEST_COUNTRY as SELLER_COUNTRY +ON SELLER_ACCOUNT.ACCOUNT_COUNTRY = SELLER_COUNTRY.COUNTRY + +where SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL=1 and SUBSTR(SELLER_ACCOUNT.ACCOUNT_COUNTRY,0,1) in ('I', 'F') +group by SELLER_COUNTRY.NAME, year(TEST_KYLIN_FACT.CAL_DT) http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql b/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql new file mode 100644 index 0000000..0e84301 --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql @@ -0,0 +1,21 @@ +SELECT + +count(*) as cnt, sum(price) as sum_price, sum(DEAL_AMOUNT) as deal_amount, SELLER_COUNTRY.NAME, DEAL_YEAR as deal_year + +FROM TEST_KYLIN_FACT as TEST_KYLIN_FACT +INNER JOIN TEST_ORDER as TEST_ORDER +ON TEST_KYLIN_FACT.ORDER_ID = TEST_ORDER.ORDER_ID +INNER JOIN TEST_ACCOUNT as BUYER_ACCOUNT +ON TEST_ORDER.BUYER_ID = BUYER_ACCOUNT.ACCOUNT_ID +INNER JOIN TEST_ACCOUNT as SELLER_ACCOUNT +ON TEST_KYLIN_FACT.SELLER_ID = SELLER_ACCOUNT.ACCOUNT_ID +INNER JOIN TEST_CATEGORY_GROUPINGS as TEST_CATEGORY_GROUPINGS +ON TEST_KYLIN_FACT.LEAF_CATEG_ID = TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_CATEGORY_GROUPINGS.SITE_ID +INNER JOIN TEST_COUNTRY as BUYER_COUNTRY +ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY +INNER JOIN TEST_COUNTRY as SELLER_COUNTRY +ON SELLER_ACCOUNT.ACCOUNT_COUNTRY = SELLER_COUNTRY.COUNTRY + + +where SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL=1 and SELLER_ACCOUNT.COUNTRY_ABBR in ('T', 'R') and BUYER_ACCOUNT.COUNTRY_ABBR in ('T', 'R') +group by SELLER_COUNTRY.NAME, DEAL_YEAR http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql.compare ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql.compare b/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql.compare new file mode 100644 index 0000000..7243d7e --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_computedcolumn/query02.sql.compare @@ -0,0 +1,21 @@ +SELECT + +count(*) as cnt, sum(price) as sum_price, sum(TEST_KYLIN_FACT.PRICE * TEST_KYLIN_FACT.ITEM_COUNT) as deal_amount, SELLER_COUNTRY.NAME, year(TEST_KYLIN_FACT.CAL_DT) as deal_year + +FROM TEST_KYLIN_FACT as TEST_KYLIN_FACT +INNER JOIN TEST_ORDER as TEST_ORDER +ON TEST_KYLIN_FACT.ORDER_ID = TEST_ORDER.ORDER_ID +INNER JOIN TEST_ACCOUNT as BUYER_ACCOUNT +ON TEST_ORDER.BUYER_ID = BUYER_ACCOUNT.ACCOUNT_ID +INNER JOIN TEST_ACCOUNT as SELLER_ACCOUNT +ON TEST_KYLIN_FACT.SELLER_ID = SELLER_ACCOUNT.ACCOUNT_ID +INNER JOIN TEST_CATEGORY_GROUPINGS as TEST_CATEGORY_GROUPINGS +ON TEST_KYLIN_FACT.LEAF_CATEG_ID = TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_CATEGORY_GROUPINGS.SITE_ID +INNER JOIN TEST_COUNTRY as BUYER_COUNTRY +ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY +INNER JOIN TEST_COUNTRY as SELLER_COUNTRY +ON SELLER_ACCOUNT.ACCOUNT_COUNTRY = SELLER_COUNTRY.COUNTRY + + +where SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL=1 and SUBSTR(SELLER_ACCOUNT.ACCOUNT_COUNTRY,1,1) in ('T', 'R') and SUBSTR(BUYER_ACCOUNT.ACCOUNT_COUNTRY,1,1) in ('T', 'R') +group by SELLER_COUNTRY.NAME, year(TEST_KYLIN_FACT.CAL_DT) http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_verifyCount/query01.sql.expected ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_verifyCount/query01.sql.expected b/kylin-it/src/test/resources/query/sql_verifyCount/query01.sql.expected index 86242f2..11636e7 100644 --- a/kylin-it/src/test/resources/query/sql_verifyCount/query01.sql.expected +++ b/kylin-it/src/test/resources/query/sql_verifyCount/query01.sql.expected @@ -1,2 +1,2 @@ * -11 +13 http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_verifyCount/query03.sql.expected ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_verifyCount/query03.sql.expected b/kylin-it/src/test/resources/query/sql_verifyCount/query03.sql.expected index 093e327..349103a 100644 --- a/kylin-it/src/test/resources/query/sql_verifyCount/query03.sql.expected +++ b/kylin-it/src/test/resources/query/sql_verifyCount/query03.sql.expected @@ -1,2 +1,2 @@ 10 -13 +15 http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/kylin-it/src/test/resources/query/sql_verifyCount/query04.sql.expected ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_verifyCount/query04.sql.expected b/kylin-it/src/test/resources/query/sql_verifyCount/query04.sql.expected index 71011db..d10e701 100644 --- a/kylin-it/src/test/resources/query/sql_verifyCount/query04.sql.expected +++ b/kylin-it/src/test/resources/query/sql_verifyCount/query04.sql.expected @@ -1,2 +1,2 @@ 100 -11 +13 http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java b/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java index 27d456f..52023e4 100644 --- a/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java +++ b/query/src/main/java/org/apache/kylin/query/schema/OLAPSchema.java @@ -78,7 +78,7 @@ public class OLAPSchema extends AbstractSchema { final String tableName = tableDesc.getName();//safe to use tableDesc.getName() here, it is in a DB context now final OLAPTable table = new OLAPTable(this, tableDesc); olapTables.put(tableName, table); - // logger.debug("Project " + projectName + " exposes table " + tableName); + //logger.debug("Project " + projectName + " exposes table " + tableName); } } http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java index df9ecfb..4217f86 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java @@ -191,7 +191,7 @@ public class ModelController extends BasicController { newModelDesc = modelService.createModelDesc(project, newModelDesc); //reload avoid shallow - metaManager.reloadDataModelDesc(newModelName); + metaManager.reloadDataModelDescAt(DataModelDesc.concatResourcePath(newModelName)); } catch (IOException e) { throw new InternalErrorException("failed to clone DataModelDesc", e); } http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java index 7f7b6f0..b176dae 100644 --- a/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java +++ b/server/src/test/java/org/apache/kylin/rest/service/CacheServiceTest.java @@ -289,7 +289,6 @@ public class CacheServiceTest extends LocalFileMetadataTestCase { return tableDesc; } - @SuppressWarnings("deprecation") @Test public void testMetaCRUD() throws Exception { final MetadataManager metadataManager = MetadataManager.getInstance(configA); http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java b/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java new file mode 100644 index 0000000..550aeb8 --- /dev/null +++ b/server/src/test/java/org/apache/kylin/rest/service/ModelServiceTest.java @@ -0,0 +1,97 @@ +/* + * 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.rest.service; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.List; + +import org.apache.kylin.job.exception.JobException; +import org.apache.kylin.metadata.MetadataManager; +import org.apache.kylin.metadata.model.ComputedColumnDesc; +import org.apache.kylin.metadata.model.DataModelDesc; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.springframework.beans.factory.annotation.Autowired; + +public class ModelServiceTest extends ServiceTestBase { + + @Autowired + ModelService modelService; + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testSuccessModelUpdate() throws IOException, JobException { + List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_inner_join_model", "default"); + Assert.assertTrue(dataModelDescs.size() == 1); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + MetadataManager.MODELDESC_SERIALIZER.serialize(dataModelDescs.get(0), new DataOutputStream(baos)); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + DataModelDesc deserialize = MetadataManager.MODELDESC_SERIALIZER.deserialize(new DataInputStream(bais)); + + deserialize.setOwner("somebody"); + DataModelDesc dataModelDesc = modelService.updateModelAndDesc(deserialize); + Assert.assertTrue(dataModelDesc.getOwner().equals("somebody")); + } + + @Test + public void testSuccessModelUpdateOnComputedColumn() throws IOException, JobException, NoSuchFieldException, IllegalAccessException { + + List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_left_join_model", "default"); + Assert.assertTrue(dataModelDescs.size() == 1); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + MetadataManager.MODELDESC_SERIALIZER.serialize(dataModelDescs.get(0), new DataOutputStream(baos)); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + DataModelDesc deserialize = MetadataManager.MODELDESC_SERIALIZER.deserialize(new DataInputStream(bais)); + + Field field = ComputedColumnDesc.class.getDeclaredField("comment"); + field.setAccessible(true); + field.set(deserialize.getComputedColumnDescs().get(0), "change on comment is okay"); + DataModelDesc dataModelDesc = modelService.updateModelAndDesc(deserialize); + } + + @Test + public void testFailureModelUpdateDueToComputedColumnConflict() throws IOException, JobException, NoSuchFieldException, IllegalAccessException { + expectedEx.expect(IllegalStateException.class); + expectedEx.expectMessage("Computed column named DEFAULT.TEST_KYLIN_FACT.DEAL_AMOUNT is already defined in other models: [DataModelDesc [name=ci_left_join_model], DataModelDesc [name=ci_inner_join_model]]. Please change another name, or try to keep consistent definition"); + + List<DataModelDesc> dataModelDescs = modelService.listAllModels("ci_left_join_model", "default"); + Assert.assertTrue(dataModelDescs.size() == 1); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + MetadataManager.MODELDESC_SERIALIZER.serialize(dataModelDescs.get(0), new DataOutputStream(baos)); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + DataModelDesc deserialize = MetadataManager.MODELDESC_SERIALIZER.deserialize(new DataInputStream(bais)); + + Field field = ComputedColumnDesc.class.getDeclaredField("expression"); + field.setAccessible(true); + field.set(deserialize.getComputedColumnDescs().get(0), "another expression"); + DataModelDesc dataModelDesc = modelService.updateModelAndDesc(deserialize); + } +} http://git-wip-us.apache.org/repos/asf/kylin/blob/9a812d5f/source-hive/src/main/java/org/apache/kylin/source/hive/SchemaChecker.java ---------------------------------------------------------------------- diff --git a/source-hive/src/main/java/org/apache/kylin/source/hive/SchemaChecker.java b/source-hive/src/main/java/org/apache/kylin/source/hive/SchemaChecker.java index 3488fbd..dbcfc7a 100644 --- a/source-hive/src/main/java/org/apache/kylin/source/hive/SchemaChecker.java +++ b/source-hive/src/main/java/org/apache/kylin/source/hive/SchemaChecker.java @@ -153,7 +153,7 @@ public class SchemaChecker { List<String> violateColumns = Lists.newArrayList(); for (ColumnDesc column : table.getColumns()) { - if (usedColumns.contains(column)) { + if (!column.isComputedColumnn() && usedColumns.contains(column)) { HiveTableMeta.HiveTableColumnMeta field = fieldsMap.get(column.getName()); if (field == null || !isColumnCompatible(column, field)) { violateColumns.add(column.getName());