use serde::{Deserialize, Serialize};
use super::{
table_metadata::VersionNumber,
view_metadata::{GeneralViewMetadata, GeneralViewMetadataBuilder, Representation},
};
pub type MaterializedViewMetadata = GeneralViewMetadata<MaterializedViewRepresentation>;
pub type MaterializedViewMetadataBuilder =
GeneralViewMetadataBuilder<MaterializedViewRepresentation>;
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "kebab-case", tag = "type")]
pub enum MaterializedViewRepresentation {
#[serde(rename_all = "kebab-case")]
SqlMaterialized {
sql: String,
dialect: String,
format_version: FormatVersion,
storage_table: String,
},
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(from = "FormatVersionSerde", into = "FormatVersionSerde")]
pub enum FormatVersion {
V1,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(untagged)]
pub enum FormatVersionSerde {
V1(VersionNumber<1>),
}
impl From<FormatVersion> for FormatVersionSerde {
fn from(value: FormatVersion) -> Self {
match value {
FormatVersion::V1 => FormatVersionSerde::V1(VersionNumber::<1>),
}
}
}
impl From<FormatVersionSerde> for FormatVersion {
fn from(value: FormatVersionSerde) -> Self {
match value {
FormatVersionSerde::V1(_) => FormatVersion::V1,
}
}
}
impl Representation for MaterializedViewRepresentation {}
pub type VersionId = i64;
pub type BaseTables = Vec<BaseTable>;
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "kebab-case")]
pub struct BaseTable {
pub identifier: String,
pub snapshot_id: i64,
}
#[cfg(test)]
mod tests {
use crate::{error::Error, spec::materialized_view_metadata::MaterializedViewMetadata};
#[test]
fn test_deserialize_materialized_view_metadata_v1() -> Result<(), Error> {
let data = r#"
{
"view-uuid": "fa6506c3-7681-40c8-86dc-e36561f83385",
"format-version" : 1,
"location" : "s3://bucket/warehouse/default.db/event_agg",
"current-version-id" : 1,
"properties" : {
"comment" : "Daily event counts"
},
"versions" : [ {
"version-id" : 1,
"timestamp-ms" : 1573518431292,
"schema-id" : 1,
"default-catalog" : "prod",
"default-namespace" : [ "default" ],
"summary" : {
"operation" : "create",
"engine-name" : "Spark",
"engineVersion" : "3.3.2"
},
"representations" : [ {
"type" : "sql-materialized",
"sql" : "SELECT\n COUNT(1), CAST(event_ts AS DATE)\nFROM events\nGROUP BY 2",
"dialect" : "spark",
"format-version": 1,
"storage-table": "s3://bucket/warehouse/default.db/event_agg/computed"
} ]
} ],
"schemas": [ {
"schema-id": 1,
"type" : "struct",
"fields" : [ {
"id" : 1,
"name" : "event_count",
"required" : false,
"type" : "int",
"doc" : "Count of events"
}, {
"id" : 2,
"name" : "event_date",
"required" : false,
"type" : "date"
} ]
} ],
"version-log" : [ {
"timestamp-ms" : 1573518431292,
"version-id" : 1
} ]
}
"#;
let metadata = serde_json::from_str::<MaterializedViewMetadata>(data)
.expect("Failed to deserialize json");
let metadata_two: MaterializedViewMetadata = serde_json::from_str(
&serde_json::to_string(&metadata).expect("Failed to serialize metadata"),
)
.expect("Failed to serialize json");
dbg!(&metadata, &metadata_two);
assert_eq!(metadata, metadata_two);
Ok(())
}
}