Ensure remote records in FETCH clauses are fetched correctly

This commit is contained in:
Tobie Morgan Hitchcock 2022-06-15 08:48:27 +01:00
parent 94a9110e06
commit a687a7f4bf
3 changed files with 15 additions and 2 deletions

View file

@ -307,7 +307,7 @@ impl Iterator {
match val {
Value::Array(v) => {
// Fetch all remote records
let val = Value::Array(v).get(ctx, opt, txn, &[Part::All]).await?;
let val = Value::Array(v).get(ctx, opt, txn, &[Part::Any]).await?;
// Set the value at the path
obj.set(ctx, opt, txn, fetch, val).await?;
}

View file

@ -17,6 +17,7 @@ use std::str;
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize)]
pub enum Part {
Any,
All,
Last,
First,
@ -103,6 +104,7 @@ impl Part {
impl fmt::Display for Part {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Part::Any => write!(f, ".."),
Part::All => write!(f, "[*]"),
Part::Last => write!(f, "[$]"),
Part::First => write!(f, "[0]"),

View file

@ -38,6 +38,7 @@ impl Value {
None => Ok(Value::None),
},
Part::All => self.get(ctx, opt, txn, path.next()).await,
Part::Any => self.get(ctx, opt, txn, path.next()).await,
_ => Ok(Value::None),
},
// Current path part is an array
@ -47,6 +48,10 @@ impl Value {
let futs = v.iter().map(|v| v.get(ctx, opt, txn, path));
try_join_all(futs).await.map(|v| v.into())
}
Part::Any => {
let futs = v.iter().map(|v| v.get(ctx, opt, txn, path));
try_join_all(futs).await.map(|v| v.into())
}
Part::First => match v.first() {
Some(v) => v.get(ctx, opt, txn, path.next()).await,
None => Ok(Value::None),
@ -132,8 +137,14 @@ impl Value {
}
}
// Ignore everything else
_ => match p {
Part::Any => match path.len() {
1 => Ok(self.clone()),
_ => Ok(Value::None),
},
_ => Ok(Value::None),
},
},
// No more parts so get the value
None => Ok(self.clone()),
}