Part 4: look up attributes for bound variables when making type determinations.
This commit is contained in:
parent
72977f52e4
commit
a07efc0a9e
2 changed files with 20 additions and 2 deletions
|
@ -599,12 +599,26 @@ impl ConjoiningClauses {
|
||||||
.ok()
|
.ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_attribute_for_value<'s>(&self, schema: &'s Schema, value: &TypedValue) -> Option<&'s Attribute> {
|
||||||
|
match value {
|
||||||
|
&TypedValue::Ref(id) => schema.attribute_for_entid(id),
|
||||||
|
&TypedValue::Keyword(ref kw) => schema.attribute_for_ident(kw),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn get_attribute<'s, 'a>(&self, schema: &'s Schema, pattern: &'a Pattern) -> Option<&'s Attribute> {
|
fn get_attribute<'s, 'a>(&self, schema: &'s Schema, pattern: &'a Pattern) -> Option<&'s Attribute> {
|
||||||
match pattern.attribute {
|
match pattern.attribute {
|
||||||
PatternNonValuePlace::Entid(id) =>
|
PatternNonValuePlace::Entid(id) =>
|
||||||
schema.attribute_for_entid(id),
|
schema.attribute_for_entid(id),
|
||||||
PatternNonValuePlace::Ident(ref kw) =>
|
PatternNonValuePlace::Ident(ref kw) =>
|
||||||
schema.attribute_for_ident(kw),
|
schema.attribute_for_ident(kw),
|
||||||
|
PatternNonValuePlace::Variable(ref var) =>
|
||||||
|
// If the pattern has a variable, we've already determined that the binding -- if
|
||||||
|
// any -- is acceptable and yields a table. Here, simply look to see if it names
|
||||||
|
// an attribute so we can find out the type.
|
||||||
|
self.value_bindings.get(var)
|
||||||
|
.and_then(|val| self.get_attribute_for_value(schema, val)),
|
||||||
_ =>
|
_ =>
|
||||||
None,
|
None,
|
||||||
}
|
}
|
||||||
|
|
|
@ -460,8 +460,12 @@ mod testing {
|
||||||
assert!(!cc.is_known_empty);
|
assert!(!cc.is_known_empty);
|
||||||
assert_eq!(cc.from, vec![SourceAlias(DatomsTable::Datoms, "datoms00".to_string())]);
|
assert_eq!(cc.from, vec![SourceAlias(DatomsTable::Datoms, "datoms00".to_string())]);
|
||||||
|
|
||||||
// ?x must be a ref.
|
// ?x must be a ref, and ?v a boolean.
|
||||||
assert_eq!(cc.known_type(&x).unwrap(), ValueType::Ref);
|
assert_eq!(cc.known_type(&x), Some(ValueType::Ref));
|
||||||
|
|
||||||
|
// We don't need to extract a type for ?v, because the attribute is known.
|
||||||
|
assert!(!cc.extracted_types.contains_key(&v));
|
||||||
|
assert_eq!(cc.known_type(&v), Some(ValueType::Boolean));
|
||||||
|
|
||||||
// ?x is bound to datoms0.e.
|
// ?x is bound to datoms0.e.
|
||||||
assert_eq!(cc.column_bindings.get(&x).unwrap(), &vec![d0_e.clone()]);
|
assert_eq!(cc.column_bindings.get(&x).unwrap(), &vec![d0_e.clone()]);
|
||||||
|
|
Loading…
Reference in a new issue