mentat/query-algebrizer/src/lib.rs

96 lines
2.4 KiB
Rust
Raw Normal View History

2017-02-03 23:52:02 +00:00
// Copyright 2016 Mozilla
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
// this file except in compliance with the License. You may obtain a copy of the
// License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
2017-02-22 03:55:27 +00:00
extern crate mentat_core;
2017-02-03 23:52:02 +00:00
extern crate mentat_query;
mod types;
mod cc;
2017-02-22 03:55:27 +00:00
use mentat_core::{
Schema,
};
2017-02-03 23:52:02 +00:00
use mentat_query::{
FindQuery,
FindSpec,
2017-02-03 23:52:02 +00:00
SrcVar,
2017-02-22 03:55:27 +00:00
WhereClause,
2017-02-03 23:52:02 +00:00
};
#[allow(dead_code)]
pub struct AlgebraicQuery {
default_source: SrcVar,
pub find_spec: FindSpec,
has_aggregates: bool,
pub limit: Option<u64>,
2017-02-22 03:55:27 +00:00
pub cc: cc::ConjoiningClauses,
2017-02-03 23:52:02 +00:00
}
impl AlgebraicQuery {
/**
* Apply a new limit to this query, if one is provided and any existing limit is larger.
*/
pub fn apply_limit(&mut self, limit: Option<u64>) {
match self.limit {
None => self.limit = limit,
Some(existing) =>
match limit {
None => (),
Some(new) =>
if new < existing {
self.limit = limit;
},
},
};
}
pub fn is_known_empty(&self) -> bool {
self.cc.is_known_empty
}
}
#[allow(dead_code)]
2017-02-22 03:55:27 +00:00
pub fn algebrize(schema: &Schema, parsed: FindQuery) -> AlgebraicQuery {
// TODO: integrate default source into pattern processing.
// TODO: flesh out the rest of find-into-context.
let mut cc = cc::ConjoiningClauses::default();
let where_clauses = parsed.where_clauses;
for where_clause in where_clauses {
if let WhereClause::Pattern(p) = where_clause {
cc.apply_pattern(schema, &p);
} else {
unimplemented!();
}
}
AlgebraicQuery {
default_source: parsed.default_source,
find_spec: parsed.find_spec,
has_aggregates: false, // TODO: we don't parse them yet.
limit: None,
2017-02-22 03:55:27 +00:00
cc: cc,
}
2017-02-03 23:52:02 +00:00
}
pub use cc::{
2017-02-22 03:55:27 +00:00
ColumnConstraint,
ConjoiningClauses,
};
pub use types::{
DatomsColumn,
DatomsTable,
QualifiedAlias,
SourceAlias,
TableAlias,
};