Expand query algebrizer. r=nalexander
This commit is contained in:
parent
76f51015d9
commit
91c75f26c8
2 changed files with 25 additions and 6 deletions
|
@ -90,7 +90,7 @@ impl DatomsColumn {
|
||||||
pub type TableAlias = String;
|
pub type TableAlias = String;
|
||||||
|
|
||||||
/// The association between a table and its alias. E.g., AllDatoms, "all_datoms123".
|
/// The association between a table and its alias. E.g., AllDatoms, "all_datoms123".
|
||||||
#[derive(PartialEq, Eq)]
|
#[derive(PartialEq, Eq, Clone)]
|
||||||
pub struct SourceAlias(pub DatomsTable, pub TableAlias);
|
pub struct SourceAlias(pub DatomsTable, pub TableAlias);
|
||||||
|
|
||||||
impl Debug for SourceAlias {
|
impl Debug for SourceAlias {
|
||||||
|
@ -187,10 +187,10 @@ pub struct ConjoiningClauses {
|
||||||
aliaser: TableAliaser,
|
aliaser: TableAliaser,
|
||||||
|
|
||||||
/// A vector of source/alias pairs used to construct a SQL `FROM` list.
|
/// A vector of source/alias pairs used to construct a SQL `FROM` list.
|
||||||
from: Vec<SourceAlias>,
|
pub from: Vec<SourceAlias>,
|
||||||
|
|
||||||
/// A list of fragments that can be joined by `AND`.
|
/// A list of fragments that can be joined by `AND`.
|
||||||
wheres: Vec<ColumnConstraint>,
|
pub wheres: Vec<ColumnConstraint>,
|
||||||
|
|
||||||
/// A map from var to qualified columns. Used to project.
|
/// A map from var to qualified columns. Used to project.
|
||||||
bindings: BTreeMap<Variable, Vec<QualifiedAlias>>,
|
bindings: BTreeMap<Variable, Vec<QualifiedAlias>>,
|
||||||
|
|
|
@ -8,14 +8,20 @@
|
||||||
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||||||
// specific language governing permissions and limitations under the License.
|
// specific language governing permissions and limitations under the License.
|
||||||
|
|
||||||
|
extern crate mentat_core;
|
||||||
extern crate mentat_query;
|
extern crate mentat_query;
|
||||||
|
|
||||||
mod cc;
|
mod cc;
|
||||||
|
|
||||||
|
use mentat_core::{
|
||||||
|
Schema,
|
||||||
|
};
|
||||||
|
|
||||||
use mentat_query::{
|
use mentat_query::{
|
||||||
FindQuery,
|
FindQuery,
|
||||||
FindSpec,
|
FindSpec,
|
||||||
SrcVar,
|
SrcVar,
|
||||||
|
WhereClause,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
@ -24,21 +30,34 @@ pub struct AlgebraicQuery {
|
||||||
find_spec: FindSpec,
|
find_spec: FindSpec,
|
||||||
has_aggregates: bool,
|
has_aggregates: bool,
|
||||||
limit: Option<i64>,
|
limit: Option<i64>,
|
||||||
cc: cc::ConjoiningClauses,
|
pub cc: cc::ConjoiningClauses,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn algebrize(parsed: FindQuery) -> AlgebraicQuery {
|
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 {
|
AlgebraicQuery {
|
||||||
default_source: parsed.default_source,
|
default_source: parsed.default_source,
|
||||||
find_spec: parsed.find_spec,
|
find_spec: parsed.find_spec,
|
||||||
has_aggregates: false, // TODO: we don't parse them yet.
|
has_aggregates: false, // TODO: we don't parse them yet.
|
||||||
limit: None,
|
limit: None,
|
||||||
cc: cc::ConjoiningClauses::default(),
|
cc: cc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use cc::{
|
pub use cc::{
|
||||||
|
ColumnConstraint,
|
||||||
ConjoiningClauses,
|
ConjoiningClauses,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue