Breathe life back into this project. #1

Merged
gburd merged 22 commits from gburd/2018edition-fmt-fix-deps into master 2020-01-16 16:27:21 +00:00
2 changed files with 26 additions and 26 deletions
Showing only changes of commit 5596873e8f - Show all commits

View file

@ -80,9 +80,9 @@ impl Projector for ScalarTwoStagePullProjector {
fn project<'stmt, 's>(&self, schema: &Schema, sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> { fn project<'stmt, 's>(&self, schema: &Schema, sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> {
// Scalar is pretty straightforward -- zero or one entity, do the pull directly. // Scalar is pretty straightforward -- zero or one entity, do the pull directly.
let results = let results =
if let Some(r) = rows.next() { if let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
let entity: Entid = row.get(0); // This will always be 0 and a ref. let entity: Entid = row.get(0).unwrap(); // This will always be 0 and a ref.
let bindings = self.puller.pull(schema, sqlite, once(entity))?; let bindings = self.puller.pull(schema, sqlite, once(entity))?;
let m = Binding::Map(bindings.get(&entity).cloned().unwrap_or_else(Default::default)); let m = Binding::Map(bindings.get(&entity).cloned().unwrap_or_else(Default::default));
QueryResults::Scalar(Some(m)) QueryResults::Scalar(Some(m))
@ -120,14 +120,14 @@ impl TupleTwoStagePullProjector {
} }
// This is exactly the same as for rel. // This is exactly the same as for rel.
fn collect_bindings<'a>(&self, row: Row<'a>) -> Result<Vec<Binding>> { fn collect_bindings<'a>(&self, row: &Row<'a>) -> Result<Vec<Binding>> {
// There will be at least as many SQL columns as Datalog columns. // There will be at least as many SQL columns as Datalog columns.
// gte 'cos we might be querying extra columns for ordering. // gte 'cos we might be querying extra columns for ordering.
// The templates will take care of ignoring columns. // The templates will take care of ignoring columns.
assert!(row.column_count() >= self.len); assert!(row.column_count() >= self.len);
self.templates self.templates
.iter() .iter()
.map(|ti| ti.lookup(&row)) .map(|ti| ti.lookup(row))
.collect::<Result<Vec<Binding>>>() .collect::<Result<Vec<Binding>>>()
} }
@ -141,8 +141,8 @@ impl TupleTwoStagePullProjector {
impl Projector for TupleTwoStagePullProjector { impl Projector for TupleTwoStagePullProjector {
fn project<'stmt, 's>(&self, schema: &Schema, sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> { fn project<'stmt, 's>(&self, schema: &Schema, sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> {
let results = let results =
if let Some(r) = rows.next() { if let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
// Keeping the compiler happy. // Keeping the compiler happy.
let pull_consumers: Result<Vec<PullConsumer>> = self.pulls let pull_consumers: Result<Vec<PullConsumer>> = self.pulls
@ -152,14 +152,14 @@ impl Projector for TupleTwoStagePullProjector {
let mut pull_consumers = pull_consumers?; let mut pull_consumers = pull_consumers?;
// Collect the usual bindings and accumulate entity IDs for pull. // Collect the usual bindings and accumulate entity IDs for pull.
for mut p in pull_consumers.iter_mut() { for p in pull_consumers.iter_mut() {
p.collect_entity(&row); p.collect_entity(&row);
} }
let mut bindings = self.collect_bindings(row)?; let mut bindings = self.collect_bindings(row)?;
// Run the pull expressions for the collected IDs. // Run the pull expressions for the collected IDs.
for mut p in pull_consumers.iter_mut() { for p in pull_consumers.iter_mut() {
p.pull(sqlite)?; p.pull(sqlite)?;
} }
@ -204,7 +204,7 @@ impl RelTwoStagePullProjector {
} }
} }
fn collect_bindings_into<'a>(&self, row: Row<'a>, out: &mut Vec<Binding>) -> Result<()> { fn collect_bindings_into<'a>(&self, row: &Row<'a>, out: &mut Vec<Binding>) -> Result<()> {
// There will be at least as many SQL columns as Datalog columns. // There will be at least as many SQL columns as Datalog columns.
// gte 'cos we might be querying extra columns for ordering. // gte 'cos we might be querying extra columns for ordering.
// The templates will take care of ignoring columns. // The templates will take care of ignoring columns.
@ -249,16 +249,16 @@ impl Projector for RelTwoStagePullProjector {
let mut pull_consumers = pull_consumers?; let mut pull_consumers = pull_consumers?;
// Collect the usual bindings and accumulate entity IDs for pull. // Collect the usual bindings and accumulate entity IDs for pull.
while let Some(r) = rows.next() { while let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
for mut p in pull_consumers.iter_mut() { for p in pull_consumers.iter_mut() {
p.collect_entity(&row); p.collect_entity(&row);
} }
self.collect_bindings_into(row, &mut values)?; self.collect_bindings_into(row, &mut values)?;
} }
// Run the pull expressions for the collected IDs. // Run the pull expressions for the collected IDs.
for mut p in pull_consumers.iter_mut() { for p in pull_consumers.iter_mut() {
p.pull(sqlite)?; p.pull(sqlite)?;
} }
@ -311,8 +311,8 @@ impl Projector for CollTwoStagePullProjector {
fn project<'stmt, 's>(&self, schema: &Schema, sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> { fn project<'stmt, 's>(&self, schema: &Schema, sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> {
let mut pull_consumer = PullConsumer::for_operation(schema, &self.pull)?; let mut pull_consumer = PullConsumer::for_operation(schema, &self.pull)?;
while let Some(r) = rows.next() { while let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
pull_consumer.collect_entity(&row); pull_consumer.collect_entity(&row);
} }

View file

@ -58,8 +58,8 @@ impl ScalarProjector {
impl Projector for ScalarProjector { impl Projector for ScalarProjector {
fn project<'stmt, 's>(&self, _schema: &Schema, _sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> { fn project<'stmt, 's>(&self, _schema: &Schema, _sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> {
let results = let results =
if let Some(r) = rows.next() { if let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
let binding = self.template.lookup(&row)?; let binding = self.template.lookup(&row)?;
QueryResults::Scalar(Some(binding)) QueryResults::Scalar(Some(binding))
} else { } else {
@ -93,7 +93,7 @@ impl TupleProjector {
} }
// This is just like we do for `rel`, but into a vec of its own. // This is just like we do for `rel`, but into a vec of its own.
fn collect_bindings<'a>(&self, row: Row<'a>) -> Result<Vec<Binding>> { fn collect_bindings<'a>(&self, row: &Row<'a>) -> Result<Vec<Binding>> {
// There will be at least as many SQL columns as Datalog columns. // There will be at least as many SQL columns as Datalog columns.
// gte 'cos we might be querying extra columns for ordering. // gte 'cos we might be querying extra columns for ordering.
// The templates will take care of ignoring columns. // The templates will take care of ignoring columns.
@ -114,8 +114,8 @@ impl TupleProjector {
impl Projector for TupleProjector { impl Projector for TupleProjector {
fn project<'stmt, 's>(&self, _schema: &Schema, _sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> { fn project<'stmt, 's>(&self, _schema: &Schema, _sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> {
let results = let results =
if let Some(r) = rows.next() { if let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
let bindings = self.collect_bindings(row)?; let bindings = self.collect_bindings(row)?;
QueryResults::Tuple(Some(bindings)) QueryResults::Tuple(Some(bindings))
} else { } else {
@ -151,7 +151,7 @@ impl RelProjector {
} }
} }
fn collect_bindings_into<'a>(&self, row: Row<'a>, out: &mut Vec<Binding>) -> Result<()> { fn collect_bindings_into<'a>(&self, row: &Row<'a>, out: &mut Vec<Binding>) -> Result<()> {
// There will be at least as many SQL columns as Datalog columns. // There will be at least as many SQL columns as Datalog columns.
// gte 'cos we might be querying extra columns for ordering. // gte 'cos we might be querying extra columns for ordering.
// The templates will take care of ignoring columns. // The templates will take care of ignoring columns.
@ -188,8 +188,8 @@ impl Projector for RelProjector {
let width = self.len; let width = self.len;
let mut values: Vec<_> = Vec::with_capacity(5 * width); let mut values: Vec<_> = Vec::with_capacity(5 * width);
while let Some(r) = rows.next() { while let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
self.collect_bindings_into(row, &mut values)?; self.collect_bindings_into(row, &mut values)?;
} }
@ -236,8 +236,8 @@ impl CollProjector {
impl Projector for CollProjector { impl Projector for CollProjector {
fn project<'stmt, 's>(&self, _schema: &Schema, _sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> { fn project<'stmt, 's>(&self, _schema: &Schema, _sqlite: &'s rusqlite::Connection, mut rows: Rows<'stmt>) -> Result<QueryOutput> {
let mut out: Vec<_> = vec![]; let mut out: Vec<_> = vec![];
while let Some(r) = rows.next() { while let Some(r) = rows.next().unwrap() {
let row = r?; let row = r;
let binding = self.template.lookup(&row)?; let binding = self.template.lookup(&row)?;
out.push(binding); out.push(binding);
} }