vegafusion_core/spec/transform/
extent.rs1use crate::expression::column_usage::{ColumnUsage, DatasetsColumnUsage, VlSelectionFields};
2use crate::spec::transform::{TransformColumns, TransformSpecTrait};
3use crate::task_graph::graph::ScopedVariable;
4use crate::task_graph::scope::TaskScope;
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7use std::collections::HashMap;
8use vegafusion_common::escape::unescape_field;
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub struct ExtentTransformSpec {
12 pub field: String, #[serde(skip_serializing_if = "Option::is_none")]
15 pub signal: Option<String>,
16
17 #[serde(flatten)]
18 pub extra: HashMap<String, Value>,
19}
20
21impl TransformSpecTrait for ExtentTransformSpec {
22 fn output_signals(&self) -> Vec<String> {
23 self.signal.clone().into_iter().collect()
24 }
25
26 fn transform_columns(
27 &self,
28 datum_var: &Option<ScopedVariable>,
29 _usage_scope: &[u32],
30 _task_scope: &TaskScope,
31 _vl_selection_fields: &VlSelectionFields,
32 ) -> TransformColumns {
33 if let Some(datum_var) = datum_var {
34 let usage = DatasetsColumnUsage::empty().with_column_usage(
35 datum_var,
36 ColumnUsage::empty().with_column(&unescape_field(&self.field)),
37 );
38 TransformColumns::PassThrough {
39 usage,
40 produced: ColumnUsage::empty(),
41 }
42 } else {
43 TransformColumns::Unknown
44 }
45 }
46
47 fn local_datetime_columns_produced(
48 &self,
49 input_local_datetime_columns: &[String],
50 ) -> Vec<String> {
51 Vec::from(input_local_datetime_columns)
54 }
55}