mentat/query-projector
Nick Alexander 2cb7d441dc Part 2: Make it easier to match tuple results.
Right now, we write code like
```rust
match q_once(q, inputs)?.into_tuple()? {
    Some(vs) => match (vs.len(), vs.get(0), vs.get(1)) {
        (2, &Some(Binding::Scalar(TypedValue::Long(a))), &Some(Binding::Scalar(TypedValue::Instant(ref b)))) => Some((a, b.clone())),
        _ => panic!(),
    },
    None => None,
}
```
to length-check tuples coming out of the database.  It can also lead
to a lot of cloning because references are the easiest thing to hand.

This commit allows to write code like
```rust
match q_once(q, inputs)?.into_tuple()? {
    Some((Binding::Scalar(TypedValue::Long(a)), Binding::Scalar(TypedValue::Instant(b)))) => Some((a, b)),
    Some(_) => panic!(),
    None => None,
}
```
which is generally much easier to reason about.
2018-07-05 16:45:42 -07:00
..
src Part 2: Make it easier to match tuple results. 2018-07-05 16:45:42 -07:00
tests Convert query-projector/ to ProjectorError. 2018-06-27 15:05:43 -07:00
Cargo.toml Convert query_projector/ to failure. 2018-06-20 14:42:10 -07:00
README.md Implement projection and querying. (#353) r=nalexander 2017-03-06 14:40:10 -08:00

This module handles the derivation from an algebrized query of two things:

  • A SQL projection: a mapping from columns mentioned in the body of the query to columns in the output.
  • A Datalog projection: a function that consumes rows of the appropriate shape (as defined by the SQL projection) to yield one of the four kinds of Datalog query result.

These two must naturally coordinate, and so they are both produced here.