dealing with aggregates in `as` constructs

main
Ziyang Hu 1 year ago
parent 9a634ff9d7
commit b0b3bb549d

@ -333,28 +333,34 @@ impl SessionTx<'_> {
rels: &NamedRows, rels: &NamedRows,
cur_vld: ValidityTs, cur_vld: ValidityTs,
) -> Result<()> { ) -> Result<()> {
let meta = InputRelationHandle { let mut key_bindings = vec![];
name: Symbol::new(name, Default::default()), for k in rels.headers.iter() {
metadata: StoredRelationMetadata { let k = k.replace('(', "_").replace(')', "");
keys: rels let k = Symbol::new(k.clone(), Default::default());
.headers if key_bindings.contains(&k) {
bail!("Duplicate variable name {}, please use distinct variables in `as` construct.", k);
}
key_bindings.push(k);
}
let keys = key_bindings
.iter() .iter()
.map(|s| ColumnDef { .map(|s| ColumnDef {
name: s.into(), name: s.name.clone(),
typing: NullableColType { typing: NullableColType {
coltype: ColType::Any, coltype: ColType::Any,
nullable: true, nullable: true,
}, },
default_gen: None, default_gen: None,
}) })
.collect_vec(), .collect_vec();
let meta = InputRelationHandle {
name: Symbol::new(name, Default::default()),
metadata: StoredRelationMetadata {
keys,
non_keys: vec![], non_keys: vec![],
}, },
key_bindings: rels key_bindings,
.headers
.iter()
.map(|s| Symbol::new(s.clone(), Default::default()))
.collect_vec(),
dep_bindings: vec![], dep_bindings: vec![],
span: Default::default(), span: Default::default(),
}; };

@ -1322,7 +1322,9 @@ fn as_store_in_imperative_script() {
) )
.unwrap(); .unwrap();
assert_eq!(res.into_json()["rows"], json!([[1, 2, 3], [4, 5, 6]])); assert_eq!(res.into_json()["rows"], json!([[1, 2, 3], [4, 5, 6]]));
let res = db.run_script(r#" let res = db
.run_script(
r#"
{ {
?[y] <- [[1], [2], [3]] ?[y] <- [[1], [2], [3]]
:create a {x default rand_uuid_v1() => y} :create a {x default rand_uuid_v1() => y}
@ -1331,9 +1333,42 @@ fn as_store_in_imperative_script() {
{ {
?[x] := *_last{_kind: 'inserted', x} ?[x] := *_last{_kind: 'inserted', x}
} }
"#, Default::default()).unwrap(); "#,
Default::default(),
)
.unwrap();
assert_eq!(3, res.rows.len()); assert_eq!(3, res.rows.len());
for row in res.into_json()["rows"].as_array().unwrap() { for row in res.into_json()["rows"].as_array().unwrap() {
println!("{}", row); println!("{}", row);
} }
assert!(db
.run_script(
r#"
{
?[x, x] := x = 1
} as _last
"#,
Default::default()
)
.is_err());
let res = db
.run_script(
r#"
{
x[y] <- [[1], [2], [3]]
?[sum(y)] := x[y]
} as _last
{
?[sum_y] := *_last{sum_y}
}
"#,
Default::default(),
)
.unwrap();
assert_eq!(1, res.rows.len());
for row in res.into_json()["rows"].as_array().unwrap() {
println!("{}", row);
}
} }

Loading…
Cancel
Save