Skip to content

Commit 1ade9dc

Browse files
committed
chore: support link format as object
1 parent fbb85aa commit 1ade9dc

File tree

9 files changed

+294
-30
lines changed

9 files changed

+294
-30
lines changed

packages/cubejs-api-gateway/openspec.yml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,34 @@ components:
273273
enum:
274274
- "percent"
275275
- "currency"
276-
V1CubeMetaDimensionFormat:
276+
V1CubeMetaDimensionSimpleFormat:
277277
type: "string"
278-
description: Format of dimension
278+
description: Simple format of dimension
279279
enum:
280280
- "imageUrl"
281281
- "id"
282282
- "link"
283283
- "percent"
284284
- "currency"
285+
V1CubeMetaDimensionLinkFormat:
286+
type: "object"
287+
description: Link format for dimension with label and type
288+
properties:
289+
label:
290+
type: "string"
291+
description: Label for the link
292+
type:
293+
type: "string"
294+
enum: ["link"]
295+
description: Type of the format (must be 'link')
296+
required:
297+
- label
298+
- type
299+
V1CubeMetaDimensionFormat:
300+
oneOf:
301+
- $ref: "#/components/schemas/V1CubeMetaDimensionSimpleFormat"
302+
- $ref: "#/components/schemas/V1CubeMetaDimensionLinkFormat"
303+
description: Format of dimension - can be either a simple string format or an object with link configuration
285304
V1MetaResponse:
286305
type: "object"
287306
properties:

rust/cubesql/cubeclient/.openapi-generator/FILES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ src/models/v1_cube_meta.rs
55
src/models/v1_cube_meta_dimension.rs
66
src/models/v1_cube_meta_dimension_format.rs
77
src/models/v1_cube_meta_dimension_granularity.rs
8+
src/models/v1_cube_meta_dimension_link_format.rs
9+
src/models/v1_cube_meta_dimension_simple_format.rs
810
src/models/v1_cube_meta_folder.rs
911
src/models/v1_cube_meta_hierarchy.rs
1012
src/models/v1_cube_meta_join.rs

rust/cubesql/cubeclient/src/models/mod.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ pub mod v1_cube_meta_dimension_format;
66
pub use self::v1_cube_meta_dimension_format::V1CubeMetaDimensionFormat;
77
pub mod v1_cube_meta_dimension_granularity;
88
pub use self::v1_cube_meta_dimension_granularity::V1CubeMetaDimensionGranularity;
9+
pub mod v1_cube_meta_dimension_link_format;
10+
pub use self::v1_cube_meta_dimension_link_format::V1CubeMetaDimensionLinkFormat;
11+
// problem with code-gen, let's rename it as re-export
12+
pub use self::v1_cube_meta_dimension_link_format::Type as V1CubeMetaDimensionLinkFormatType;
13+
pub mod v1_cube_meta_dimension_simple_format;
14+
pub use self::v1_cube_meta_dimension_simple_format::V1CubeMetaDimensionSimpleFormat;
915
pub mod v1_cube_meta_folder;
1016
pub use self::v1_cube_meta_folder::V1CubeMetaFolder;
1117
pub mod v1_cube_meta_hierarchy;
@@ -24,6 +30,8 @@ pub mod v1_cube_meta_type;
2430
pub use self::v1_cube_meta_type::V1CubeMetaType;
2531
pub mod v1_error;
2632
pub use self::v1_error::V1Error;
33+
pub mod v1_load_continue_wait;
34+
pub use self::v1_load_continue_wait::V1LoadContinueWait;
2735
pub mod v1_load_request;
2836
pub use self::v1_load_request::V1LoadRequest;
2937
pub mod v1_load_request_query;
@@ -40,8 +48,8 @@ pub mod v1_load_request_query_join_subquery;
4048
pub use self::v1_load_request_query_join_subquery::V1LoadRequestQueryJoinSubquery;
4149
pub mod v1_load_request_query_time_dimension;
4250
pub use self::v1_load_request_query_time_dimension::V1LoadRequestQueryTimeDimension;
43-
pub mod v1_load_continue_wait;
44-
pub use self::v1_load_continue_wait::V1LoadContinueWait;
51+
pub mod v1_load_request_query_time_dimension_date_range_filter;
52+
pub use self::v1_load_request_query_time_dimension_date_range_filter::V1LoadRequestQueryTimeDimensionDateRangeFilter;
4553
pub mod v1_load_response;
4654
pub use self::v1_load_response::V1LoadResponse;
4755
pub mod v1_load_result;

rust/cubesql/cubeclient/src/models/v1_cube_meta_dimension.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub struct V1CubeMetaDimension {
3131
#[serde(rename = "meta", skip_serializing_if = "Option::is_none")]
3232
pub meta: Option<serde_json::Value>,
3333
#[serde(rename = "format", skip_serializing_if = "Option::is_none")]
34-
pub format: Option<models::V1CubeMetaDimensionFormat>,
34+
pub format: Option<Box<models::V1CubeMetaDimensionFormat>>,
3535
}
3636

3737
impl V1CubeMetaDimension {

rust/cubesql/cubeclient/src/models/v1_cube_meta_dimension_format.rs

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,29 @@
1111
use crate::models;
1212
use serde::{Deserialize, Serialize};
1313

14-
/// V1CubeMetaDimensionFormat : Format of dimension
15-
/// Format of dimension
16-
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
14+
/// V1CubeMetaDimensionFormat : Format of dimension - can be either a simple string format or an object with link configuration
15+
/// Format of dimension - can be either a simple string format or an object with link configuration
16+
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash, PartialOrd, Ord)]
17+
#[serde(untagged)]
1718
pub enum V1CubeMetaDimensionFormat {
18-
#[serde(rename = "imageUrl")]
19-
ImageUrl,
20-
#[serde(rename = "id")]
21-
Id,
22-
#[serde(rename = "link")]
23-
Link,
24-
#[serde(rename = "percent")]
25-
Percent,
26-
#[serde(rename = "currency")]
27-
Currency,
19+
V1CubeMetaDimensionSimpleFormat(models::V1CubeMetaDimensionSimpleFormat),
20+
V1CubeMetaDimensionLinkFormat(Box<models::V1CubeMetaDimensionLinkFormat>),
2821
}
2922

30-
impl std::fmt::Display for V1CubeMetaDimensionFormat {
31-
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
32-
match self {
33-
Self::ImageUrl => write!(f, "imageUrl"),
34-
Self::Id => write!(f, "id"),
35-
Self::Link => write!(f, "link"),
36-
Self::Percent => write!(f, "percent"),
37-
Self::Currency => write!(f, "currency"),
38-
}
23+
impl Default for V1CubeMetaDimensionFormat {
24+
fn default() -> Self {
25+
Self::V1CubeMetaDimensionSimpleFormat(Default::default())
3926
}
4027
}
28+
/// Type of the format (must be 'link')
29+
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
30+
pub enum Type {
31+
#[serde(rename = "link")]
32+
Link,
33+
}
4134

42-
impl Default for V1CubeMetaDimensionFormat {
43-
fn default() -> V1CubeMetaDimensionFormat {
44-
Self::ImageUrl
35+
impl Default for Type {
36+
fn default() -> Type {
37+
Self::Link
4538
}
4639
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Cube.js
3+
*
4+
* Cube.js Swagger Schema
5+
*
6+
* The version of the OpenAPI document: 1.0.0
7+
*
8+
* Generated by: https://openapi-generator.tech
9+
*/
10+
11+
use crate::models;
12+
use serde::{Deserialize, Serialize};
13+
14+
/// V1CubeMetaDimensionLinkFormat : Link format for dimension with label and type
15+
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, Eq, Hash, PartialOrd, Ord)]
16+
pub struct V1CubeMetaDimensionLinkFormat {
17+
/// Label for the link
18+
#[serde(rename = "label")]
19+
pub label: String,
20+
/// Type of the format (must be 'link')
21+
#[serde(rename = "type")]
22+
pub r#type: Type,
23+
}
24+
25+
impl V1CubeMetaDimensionLinkFormat {
26+
/// Link format for dimension with label and type
27+
pub fn new(label: String, r#type: Type) -> V1CubeMetaDimensionLinkFormat {
28+
V1CubeMetaDimensionLinkFormat { label, r#type }
29+
}
30+
}
31+
/// Type of the format (must be 'link')
32+
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
33+
pub enum Type {
34+
#[serde(rename = "link")]
35+
Link,
36+
}
37+
38+
impl Default for Type {
39+
fn default() -> Type {
40+
Self::Link
41+
}
42+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Cube.js
3+
*
4+
* Cube.js Swagger Schema
5+
*
6+
* The version of the OpenAPI document: 1.0.0
7+
*
8+
* Generated by: https://openapi-generator.tech
9+
*/
10+
11+
use crate::models;
12+
use serde::{Deserialize, Serialize};
13+
14+
/// V1CubeMetaDimensionSimpleFormat : Simple format of dimension
15+
/// Simple format of dimension
16+
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
17+
pub enum V1CubeMetaDimensionSimpleFormat {
18+
#[serde(rename = "imageUrl")]
19+
ImageUrl,
20+
#[serde(rename = "id")]
21+
Id,
22+
#[serde(rename = "link")]
23+
Link,
24+
#[serde(rename = "percent")]
25+
Percent,
26+
#[serde(rename = "currency")]
27+
Currency,
28+
}
29+
30+
impl std::fmt::Display for V1CubeMetaDimensionSimpleFormat {
31+
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
32+
match self {
33+
Self::ImageUrl => write!(f, "imageUrl"),
34+
Self::Id => write!(f, "id"),
35+
Self::Link => write!(f, "link"),
36+
Self::Percent => write!(f, "percent"),
37+
Self::Currency => write!(f, "currency"),
38+
}
39+
}
40+
}
41+
42+
impl Default for V1CubeMetaDimensionSimpleFormat {
43+
fn default() -> V1CubeMetaDimensionSimpleFormat {
44+
Self::ImageUrl
45+
}
46+
}
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
use cubeclient::models::*;
2+
3+
#[test]
4+
fn test_deserialize_meta_response_with_format_fields() {
5+
let json_data = r#"{
6+
"cubes": [
7+
{
8+
"name": "orders",
9+
"type": "cube",
10+
"title": "Orders",
11+
"isVisible": false,
12+
"public": false,
13+
"connectedComponent": 1,
14+
"measures": [
15+
{
16+
"name": "orders.count",
17+
"title": "Orders Count",
18+
"shortTitle": "Count",
19+
"cumulativeTotal": false,
20+
"cumulative": false,
21+
"type": "number",
22+
"aggType": "count",
23+
"drillMembers": [],
24+
"drillMembersGrouped": {
25+
"measures": [],
26+
"dimensions": []
27+
},
28+
"meta": {
29+
"random_field_name": "My custom metadata for meta count"
30+
},
31+
"isVisible": false,
32+
"public": false
33+
},
34+
{
35+
"name": "orders.min_amount",
36+
"title": "Orders Min Amount",
37+
"shortTitle": "Min Amount",
38+
"format": "currency",
39+
"cumulativeTotal": false,
40+
"cumulative": false,
41+
"type": "number",
42+
"aggType": "min",
43+
"drillMembers": [],
44+
"drillMembersGrouped": {
45+
"measures": [],
46+
"dimensions": []
47+
},
48+
"isVisible": false,
49+
"public": false
50+
},
51+
{
52+
"name": "orders.total_amount",
53+
"title": "Orders Total Amount",
54+
"shortTitle": "Total Amount",
55+
"format": "currency",
56+
"cumulativeTotal": false,
57+
"cumulative": false,
58+
"type": "number",
59+
"aggType": "sum",
60+
"drillMembers": [],
61+
"drillMembersGrouped": {
62+
"measures": [],
63+
"dimensions": []
64+
},
65+
"isVisible": false,
66+
"public": false
67+
}
68+
],
69+
"dimensions": [
70+
{
71+
"name": "orders.id",
72+
"title": "Orders Id",
73+
"type": "number",
74+
"shortTitle": "Id",
75+
"suggestFilterValues": true,
76+
"isVisible": false,
77+
"public": false,
78+
"primaryKey": true
79+
},
80+
{
81+
"name": "orders.order_sum",
82+
"title": "Orders Order Sum",
83+
"type": "number",
84+
"shortTitle": "Order Sum",
85+
"suggestFilterValues": true,
86+
"format": "currency",
87+
"isVisible": false,
88+
"public": false,
89+
"primaryKey": false
90+
}
91+
],
92+
"segments": [],
93+
"hierarchies": [],
94+
"folders": [],
95+
"nestedFolders": []
96+
}
97+
]
98+
}"#;
99+
100+
// Test basic deserialization
101+
let meta_response: V1MetaResponse =
102+
serde_json::from_str(json_data).expect("Should successfully deserialize meta response");
103+
104+
// Verify the response structure
105+
assert!(meta_response.cubes.is_some());
106+
let cubes = meta_response.cubes.unwrap();
107+
assert_eq!(cubes.len(), 1);
108+
}
109+
110+
#[test]
111+
fn test_deserialize_dimension_link_format() {
112+
let json_data = r#"{
113+
"cubes": [
114+
{
115+
"name": "test_cube",
116+
"type": "cube",
117+
"measures": [],
118+
"dimensions": [
119+
{
120+
"name": "test.link_dimension",
121+
"title": "Test Link Dimension",
122+
"type": "string",
123+
"format": {
124+
"type": "link",
125+
"label": "View Details"
126+
}
127+
}
128+
],
129+
"segments": []
130+
}
131+
]
132+
}"#;
133+
134+
let meta_response: V1MetaResponse =
135+
serde_json::from_str(json_data).expect("Should successfully deserialize link format");
136+
137+
let cubes = meta_response.cubes.unwrap();
138+
let dimension = &cubes[0].dimensions[0];
139+
140+
assert_eq!(
141+
dimension.format,
142+
Some(Box::new(
143+
V1CubeMetaDimensionFormat::V1CubeMetaDimensionLinkFormat(Box::new(
144+
V1CubeMetaDimensionLinkFormat {
145+
label: "View Details".to_string(),
146+
r#type: V1CubeMetaDimensionLinkFormatType::Link,
147+
}
148+
))
149+
))
150+
);
151+
}

rust/cubesql/cubesql/src/transport/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ pub type CubeMetaNestedFolder = cubeclient::models::V1CubeMetaNestedFolder;
1414
pub type CubeMetaNestedFolderMember = cubeclient::models::V1CubeMetaNestedFolderMember;
1515
pub type CubeMetaHierarchy = cubeclient::models::V1CubeMetaHierarchy;
1616
pub type CubeMetaDimensionFormat = cubeclient::models::V1CubeMetaDimensionFormat;
17+
pub type CubeMetaDimensionSimpleFormat = cubeclient::models::V1CubeMetaDimensionSimpleFormat;
18+
pub type CubeMetaDimensionLinkFormat = cubeclient::models::V1CubeMetaDimensionLinkFormat;
19+
pub type CubeMetaDimensionLinkFormatType = cubeclient::models::V1CubeMetaDimensionLinkFormatType;
1720
pub type CubeMetaMeasureFormat = cubeclient::models::V1CubeMetaMeasureFormat;
1821
// Request/Response
1922
pub type TransportLoadResponse = cubeclient::models::V1LoadResponse;

0 commit comments

Comments
 (0)