diff --git a/packages/cubejs-backend-native/Cargo.lock b/packages/cubejs-backend-native/Cargo.lock index 6ac9985507c03..e717cfd5e62f0 100644 --- a/packages/cubejs-backend-native/Cargo.lock +++ b/packages/cubejs-backend-native/Cargo.lock @@ -79,7 +79,7 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "arrow" version = "11.1.0" -source = "git+https://github.com/cube-js/arrow-rs.git?rev=0bc721700352afe8267dba82388b81deffc24095#0bc721700352afe8267dba82388b81deffc24095" +source = "git+https://github.com/cube-js/arrow-rs.git?rev=51f62a72c625cad48c8bd705e89834c3209744b3#51f62a72c625cad48c8bd705e89834c3209744b3" dependencies = [ "bitflags", "chrono", @@ -95,6 +95,7 @@ dependencies = [ "num", "rand 0.8.5", "regex", + "regex-syntax", "serde", "serde_derive", "serde_json", @@ -167,7 +168,7 @@ dependencies = [ "async-trait", "axum-core", "bitflags", - "bytes 1.1.0", + "bytes 1.3.0", "futures-util", "http", "http-body", @@ -194,7 +195,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bdc19781b16e32f8a7200368a336fa4509d4b72ef15dd4e41df5290855ee1e6" dependencies = [ "async-trait", - "bytes 1.1.0", + "bytes 1.3.0", "futures-util", "http", "http-body", @@ -388,9 +389,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" [[package]] name = "cc" @@ -632,7 +633,7 @@ dependencies = [ [[package]] name = "cube-ext" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=c9761d716dee9546142d4ef3716466b4cb012f3e#c9761d716dee9546142d4ef3716466b4cb012f3e" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=8c7e29c227951daa8ad73ea248985a633afc6649#8c7e29c227951daa8ad73ea248985a633afc6649" dependencies = [ "arrow", "chrono", @@ -685,7 +686,7 @@ dependencies = [ "bincode", "bitflags", "byteorder", - "bytes 0.5.6", + "bytes 1.3.0", "chrono", "chrono-tz", "comfy-table 4.1.1", @@ -725,7 +726,7 @@ dependencies = [ [[package]] name = "datafusion" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=c9761d716dee9546142d4ef3716466b4cb012f3e#c9761d716dee9546142d4ef3716466b4cb012f3e" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=8c7e29c227951daa8ad73ea248985a633afc6649#8c7e29c227951daa8ad73ea248985a633afc6649" dependencies = [ "ahash", "arrow", @@ -737,6 +738,7 @@ dependencies = [ "datafusion-physical-expr", "futures", "hashbrown 0.12.0", + "itertools", "lazy_static", "log", "num_cpus", @@ -757,7 +759,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=c9761d716dee9546142d4ef3716466b4cb012f3e#c9761d716dee9546142d4ef3716466b4cb012f3e" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=8c7e29c227951daa8ad73ea248985a633afc6649#8c7e29c227951daa8ad73ea248985a633afc6649" dependencies = [ "arrow", "ordered-float 2.10.0", @@ -768,7 +770,7 @@ dependencies = [ [[package]] name = "datafusion-data-access" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=c9761d716dee9546142d4ef3716466b4cb012f3e#c9761d716dee9546142d4ef3716466b4cb012f3e" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=8c7e29c227951daa8ad73ea248985a633afc6649#8c7e29c227951daa8ad73ea248985a633afc6649" dependencies = [ "async-trait", "chrono", @@ -781,7 +783,7 @@ dependencies = [ [[package]] name = "datafusion-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=c9761d716dee9546142d4ef3716466b4cb012f3e#c9761d716dee9546142d4ef3716466b4cb012f3e" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=8c7e29c227951daa8ad73ea248985a633afc6649#8c7e29c227951daa8ad73ea248985a633afc6649" dependencies = [ "ahash", "arrow", @@ -792,7 +794,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=c9761d716dee9546142d4ef3716466b4cb012f3e#c9761d716dee9546142d4ef3716466b4cb012f3e" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=8c7e29c227951daa8ad73ea248985a633afc6649#8c7e29c227951daa8ad73ea248985a633afc6649" dependencies = [ "ahash", "arrow", @@ -1141,7 +1143,7 @@ version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "fnv", "futures-core", "futures-sink", @@ -1227,7 +1229,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "fnv", "itoa 1.0.1", ] @@ -1238,7 +1240,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "http", "pin-project-lite", ] @@ -1273,7 +1275,7 @@ version = "0.14.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "futures-channel", "futures-core", "futures-util", @@ -1762,7 +1764,7 @@ dependencies = [ "bigdecimal 0.2.2", "bitflags", "byteorder", - "bytes 1.1.0", + "bytes 1.3.0", "chrono", "flate2", "lazy_static", @@ -2071,7 +2073,7 @@ dependencies = [ [[package]] name = "parquet" version = "11.1.0" -source = "git+https://github.com/cube-js/arrow-rs.git?rev=0bc721700352afe8267dba82388b81deffc24095#0bc721700352afe8267dba82388b81deffc24095" +source = "git+https://github.com/cube-js/arrow-rs.git?rev=51f62a72c625cad48c8bd705e89834c3209744b3#51f62a72c625cad48c8bd705e89834c3209744b3" dependencies = [ "arrow", "base64 0.13.0", @@ -2126,7 +2128,7 @@ dependencies = [ "anyhow", "async-trait", "byteorder", - "bytes 0.5.6", + "bytes 1.3.0", "chrono", "log", "thiserror", @@ -2216,7 +2218,7 @@ version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8bbcd5f6deb39585a0d9f4ef34c4a41c25b7ad26d23c75d837d78c8e7adc85f" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "fallible-iterator", "futures", "log", @@ -2232,7 +2234,7 @@ checksum = "878c6cbf956e03af9aa8204b407b9cbf47c072164800aa918c516cd4b056c50c" dependencies = [ "base64 0.13.0", "byteorder", - "bytes 1.1.0", + "bytes 1.3.0", "fallible-iterator", "hmac", "md-5", @@ -2248,7 +2250,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebd6e8b7189a73169290e89bd24c771071f1012d8fe6f738f5226531f0b03d89" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "fallible-iterator", "postgres-protocol", ] @@ -2309,7 +2311,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "prost-derive", ] @@ -2332,7 +2334,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "prost", ] @@ -2562,9 +2564,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" @@ -2582,7 +2584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ "base64 0.13.0", - "bytes 1.1.0", + "bytes 1.3.0", "encoding_rs", "futures-core", "futures-util", @@ -2653,7 +2655,7 @@ checksum = "34a3bb58e85333f1ab191bf979104b586ebd77475bc6681882825f4532dfe87c" dependencies = [ "arrayvec 0.7.2", "byteorder", - "bytes 1.1.0", + "bytes 1.3.0", "num-traits", "postgres", "serde", @@ -2919,7 +2921,7 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "sqlparser" version = "0.16.0" -source = "git+https://github.com/cube-js/sqlparser-rs.git?rev=19f730c8274b39f55224824c98687dc55aa95c92#19f730c8274b39f55224824c98687dc55aa95c92" +source = "git+https://github.com/cube-js/sqlparser-rs.git?rev=10782e5d11fc0e2900c9359dddee0fbefbffd359#10782e5d11fc0e2900c9359dddee0fbefbffd359" dependencies = [ "log", ] @@ -3185,7 +3187,7 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "libc", "memchr", "mio 0.8.2", @@ -3229,7 +3231,7 @@ checksum = "19c88a47a23c5d2dc9ecd28fb38fba5fc7e5ddc1fe64488ec145076b0c71c8ae" dependencies = [ "async-trait", "byteorder", - "bytes 1.1.0", + "bytes 1.3.0", "fallible-iterator", "futures", "log", @@ -3272,7 +3274,7 @@ version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "futures-core", "futures-io", "futures-sink", @@ -3287,7 +3289,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" dependencies = [ - "bytes 1.1.0", + "bytes 1.3.0", "futures-core", "futures-sink", "pin-project-lite", @@ -3305,7 +3307,7 @@ dependencies = [ "async-trait", "axum", "base64 0.13.0", - "bytes 1.1.0", + "bytes 1.3.0", "futures-core", "futures-util", "h2", @@ -3354,7 +3356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d342c6d58709c0a6d48d48dabbb62d4ef955cf5f0f3bbfd845838e7ae88dbae" dependencies = [ "bitflags", - "bytes 1.1.0", + "bytes 1.3.0", "futures-core", "futures-util", "http", diff --git a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js index 63b046d5a398c..338bc11124281 100644 --- a/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/src/adapter/BaseQuery.js @@ -1991,12 +1991,16 @@ class BaseQuery { return this.primaryKeyCount(cubeName, true); } } - if (symbol.type === 'number') { + if (BaseQuery.isCalculatedMeasureType(symbol.type)) { return evaluateSql; } return `${symbol.type}(${evaluateSql})`; } + static isCalculatedMeasureType(type) { + return type === 'number' || type === 'string' || type === 'time' || type === 'boolean'; + } + aggregateOnGroupedColumn(symbol, evaluateSql, topLevelMerge, measurePath) { const cumulativeMeasureFilters = (this.safeEvaluateSymbolContext().cumulativeMeasureFilters || {})[measurePath]; if (cumulativeMeasureFilters) { diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js index c7f394a5936bf..0254cf04c154d 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js +++ b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js @@ -3,7 +3,7 @@ import R from 'ramda'; import camelCase from 'camelcase'; import { UserError } from './UserError'; -import { BaseMeasure } from '../adapter'; +import { BaseMeasure, BaseQuery } from '../adapter'; export class CubeToMetaTransformer { constructor(cubeValidator, cubeEvaluator, contextEvaluator, joinGraph) { @@ -106,6 +106,9 @@ export class CubeToMetaTransformer { cubeName, drillMembers, { originalSorting: true } )) || []; + // TODO support type qualifiers on min and max + const type = BaseQuery.isCalculatedMeasureType(nameToMetric[1].type) ? nameToMetric[1].type : 'number'; + return { name, title: this.title(cubeTitle, nameToMetric), @@ -114,7 +117,7 @@ export class CubeToMetaTransformer { format: nameToMetric[1].format, cumulativeTotal: nameToMetric[1].cumulative || BaseMeasure.isCumulative(nameToMetric[1]), cumulative: nameToMetric[1].cumulative || BaseMeasure.isCumulative(nameToMetric[1]), - type: 'number', // TODO + type, aggType: nameToMetric[1].type, drillMembers: drillMembersArray, drillMembersGrouped: { diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.js b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.js index d8eab7696f0d4..8240bf2d7a97c 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.js +++ b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.js @@ -413,6 +413,14 @@ const CubeRefreshKeySchema = condition( ) ); +const measureType = Joi.string().valid( + 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' +); + +const measureTypeWithCount = Joi.string().valid( + 'count', 'number', 'string', 'boolean', 'time', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' +); + const MeasuresSchema = Joi.object().pattern(identifierRegex, Joi.alternatives().conditional( Joi.ref('.type'), [ { @@ -423,19 +431,13 @@ const MeasuresSchema = Joi.object().pattern(identifierRegex, Joi.alternatives(). }) }, { - is: Joi.string().valid( - 'number', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' - ), + is: measureType, then: inherit(BaseMeasure, { sql: Joi.func().required(), - type: Joi.any().valid( - 'number', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' - ).required() + type: measureType.required() }), otherwise: Joi.object().keys({ - type: Joi.string().valid( - 'count', 'number', 'sum', 'avg', 'min', 'max', 'countDistinct', 'runningTotal', 'countDistinctApprox' - ).required() + type: measureTypeWithCount.required() }) } ] diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts index 02fd5d4a87e0d..82160f65f93d2 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts @@ -95,6 +95,10 @@ describe('SQL Generation', () => { type: 'avg', sql: \`\${doubledCheckings}\` }, + strCase: { + sql: \`CASE WHEN \${visitor_count} > 1 THEN 'More than 1' ELSE (\${visitor_revenue})::text END\`, + type: \`string\` + }, ...(['foo', 'bar'].map(m => ({ [m]: { type: 'count' } })).reduce((a, b) => ({ ...a, ...b }))) }, @@ -484,6 +488,20 @@ describe('SQL Generation', () => { visitors__per_visitor_revenue: '60' }])); + it('string measure', async () => runQueryTest({ + measures: [ + 'visitors.strCase', + ], + timeDimensions: [{ + dimension: 'visitors.created_at', + dateRange: ['2017-01-01', '2017-01-30'] + }], + timezone: 'America/Los_Angeles', + order: [] + }, [{ + visitors__str_case: 'More than 1' + }])); + it('running total', async () => { await compiler.compile(); diff --git a/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts b/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts index e8e35f0907d61..597f4b535a4e8 100644 --- a/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts @@ -75,7 +75,7 @@ describe('Cube Validation', () => { const validationResult = cubeValidator.validate(cube, { error: (message, e) => { console.log(message); - expect(message).toContain('must be one of [count, number, sum'); + expect(message).toContain('must be one of [count, number,'); } }); diff --git a/rust/cubesql/cubesql/src/compile/mod.rs b/rust/cubesql/cubesql/src/compile/mod.rs index 9ccef0cbf9127..d75221b6d6357 100644 --- a/rust/cubesql/cubesql/src/compile/mod.rs +++ b/rust/cubesql/cubesql/src/compile/mod.rs @@ -1515,7 +1515,9 @@ pub fn find_cube_scans_deep_search( #[cfg(test)] mod tests { use chrono::Datelike; - use cubeclient::models::{V1LoadRequestQueryFilterItem, V1LoadRequestQueryTimeDimension}; + use cubeclient::models::{ + V1CubeMeta, V1LoadRequestQueryFilterItem, V1LoadRequestQueryTimeDimension, + }; use datafusion::{dataframe::DataFrame as DFDataFrame, logical_plan::plan::Filter}; use pretty_assertions::assert_eq; use regex::Regex; @@ -1524,7 +1526,10 @@ mod tests { test::{get_test_session, get_test_tenant_ctx}, *, }; - use crate::sql::{dataframe::batch_to_dataframe, types::StatusFlags}; + use crate::{ + compile::test::{get_string_cube_meta, get_test_tenant_ctx_with_meta}, + sql::{dataframe::batch_to_dataframe, types::StatusFlags}, + }; use datafusion::logical_plan::PlanVisitor; use log::Level; use serde_json::json; @@ -1562,6 +1567,22 @@ mod tests { query.unwrap() } + async fn convert_select_to_query_plan_with_meta( + query: String, + meta: Vec, + ) -> QueryPlan { + env::set_var("TZ", "UTC"); + + let query = convert_sql_to_cube_query( + &query, + get_test_tenant_ctx_with_meta(meta), + get_test_session(DatabaseProtocol::PostgreSQL).await, + ) + .await; + + query.unwrap() + } + trait LogicalPlanTestUtils { fn find_projection_schema(&self) -> DFSchemaRef; @@ -3548,6 +3569,35 @@ ORDER BY \"COUNT(count)\" DESC" } } + #[tokio::test] + async fn test_string_measure() { + init_logger(); + + let logical_plan = convert_select_to_query_plan_with_meta( + r#" + SELECT MIN(StringCube.someString), MAX(StringCube.someString) FROM StringCube + "# + .to_string(), + get_string_cube_meta(), + ) + .await + .as_logical_plan(); + + assert_eq!( + logical_plan.find_cube_scan().request, + V1LoadRequestQuery { + measures: Some(vec!["StringCube.someString".to_string(),]), + dimensions: Some(vec![]), + segments: Some(vec![]), + time_dimensions: None, + order: None, + limit: None, + offset: None, + filters: None + } + ) + } + #[tokio::test] async fn test_select_error() { let variants = vec![ diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs index 594145e1b4891..758205adb3e68 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs @@ -2329,7 +2329,11 @@ impl MemberRules { .as_ref() .unwrap_or(&"unknown".to_string()) .to_uppercase(); - if agg_type == "NUMBER" { + if agg_type == "NUMBER" + || agg_type == "STRING" + || agg_type == "TIME" + || agg_type == "BOOLEAN" + { agg_type = "MEASURE".to_string(); } subst.insert( diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index 66ae87d84f3ff..e1251b4943a43 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -138,10 +138,30 @@ pub fn get_test_meta() -> Vec { ] } +pub fn get_string_cube_meta() -> Vec { + vec![V1CubeMeta { + name: "StringCube".to_string(), + title: None, + dimensions: vec![], + measures: vec![V1CubeMetaMeasure { + name: "StringCube.someString".to_string(), + title: None, + _type: "string".to_string(), + agg_type: Some("string".to_string()), + }], + segments: vec![], + joins: None, + }] +} + pub fn get_test_tenant_ctx() -> Arc { Arc::new(MetaContext::new(get_test_meta())) } +pub fn get_test_tenant_ctx_with_meta(meta: Vec) -> Arc { + Arc::new(MetaContext::new(meta)) +} + pub async fn get_test_session(protocol: DatabaseProtocol) -> Arc { let server = Arc::new(ServerManager::new( get_test_auth(), diff --git a/rust/cubesql/cubesql/src/transport/ext.rs b/rust/cubesql/cubesql/src/transport/ext.rs index 5b7806e5edc68..c9e7f1a86f32d 100644 --- a/rust/cubesql/cubesql/src/transport/ext.rs +++ b/rust/cubesql/cubesql/src/transport/ext.rs @@ -31,6 +31,16 @@ impl V1CubeMetaMeasureExt for V1CubeMetaMeasure { agg_type.eq(&"sum".to_string()) || agg_type.eq(&"count".to_string()) || agg_type.eq(&"number".to_string()) + } else if expect_agg_type.eq(&"min".to_string()) + || expect_agg_type.eq(&"max".to_string()) + { + let agg_type = self.agg_type.as_ref().unwrap(); + + agg_type.eq(&"number".to_string()) + || agg_type.eq(&"string".to_string()) + || agg_type.eq(&"time".to_string()) + || agg_type.eq(&"boolean".to_string()) + || agg_type.eq(expect_agg_type) } else { self.agg_type.as_ref().unwrap().eq(expect_agg_type) }