Updates join reordering to take care of nested triples

pull/171/head
Tpt 4 years ago
parent dedbfbafa0
commit ae0422d21c
  1. 82
      lib/src/sparql/plan_builder.rs

@ -1148,8 +1148,8 @@ fn sort_bgp(p: &[TriplePattern]) -> Vec<&TriplePattern> {
for i in 0..new_p.len() {
(&mut new_p[i..]).sort_by(|p1, p2| {
count_pattern_binds(p2, &assigned_variables, &assigned_blank_nodes).cmp(
&count_pattern_binds(p1, &assigned_variables, &assigned_blank_nodes),
estimate_pattern_cost(p1, &assigned_variables, &assigned_blank_nodes).cmp(
&estimate_pattern_cost(p2, &assigned_variables, &assigned_blank_nodes),
)
});
add_pattern_variables(new_p[i], &mut assigned_variables, &mut assigned_blank_nodes);
@ -1158,40 +1158,50 @@ fn sort_bgp(p: &[TriplePattern]) -> Vec<&TriplePattern> {
new_p
}
fn count_pattern_binds(
fn estimate_pattern_cost(
pattern: &TriplePattern,
assigned_variables: &HashSet<&Variable>,
assigned_blank_nodes: &HashSet<&BlankNode>,
) -> u8 {
let mut count = 12;
if let TermPattern::Variable(v) = &pattern.subject {
if !assigned_variables.contains(v) {
count -= 4;
) -> u32 {
let mut count = 0;
match &pattern.subject {
TermPattern::NamedNode(_) | TermPattern::Literal(_) => count += 1,
TermPattern::BlankNode(bnode) => {
if !assigned_blank_nodes.contains(bnode) {
count += 4;
}
}
} else if let TermPattern::BlankNode(bnode) = &pattern.subject {
if !assigned_blank_nodes.contains(bnode) {
count -= 4;
TermPattern::Variable(v) => {
if !assigned_variables.contains(v) {
count += 4;
}
}
TermPattern::Triple(t) => {
count += estimate_pattern_cost(t, assigned_variables, assigned_blank_nodes)
}
} else {
count -= 1;
}
if let NamedNodePattern::Variable(v) = &pattern.predicate {
if !assigned_variables.contains(v) {
count -= 4;
count += 4;
}
} else {
count -= 1;
count += 1;
}
if let TermPattern::Variable(v) = &pattern.object {
if !assigned_variables.contains(v) {
count -= 4;
match &pattern.object {
TermPattern::NamedNode(_) | TermPattern::Literal(_) => count += 1,
TermPattern::BlankNode(bnode) => {
if !assigned_blank_nodes.contains(bnode) {
count += 4;
}
}
TermPattern::Variable(v) => {
if !assigned_variables.contains(v) {
count += 4;
}
}
} else if let TermPattern::BlankNode(bnode) = &pattern.object {
if !assigned_blank_nodes.contains(bnode) {
count -= 4;
TermPattern::Triple(t) => {
count += estimate_pattern_cost(t, assigned_variables, assigned_blank_nodes)
}
} else {
count -= 1;
}
count
}
@ -1201,17 +1211,27 @@ fn add_pattern_variables<'a>(
variables: &mut HashSet<&'a Variable>,
blank_nodes: &mut HashSet<&'a BlankNode>,
) {
if let TermPattern::Variable(v) = &pattern.subject {
variables.insert(v);
} else if let TermPattern::BlankNode(bnode) = &pattern.subject {
blank_nodes.insert(bnode);
match &pattern.subject {
TermPattern::NamedNode(_) | TermPattern::Literal(_) => (),
TermPattern::BlankNode(bnode) => {
blank_nodes.insert(bnode);
}
TermPattern::Variable(v) => {
variables.insert(v);
}
TermPattern::Triple(t) => add_pattern_variables(t, variables, blank_nodes),
}
if let NamedNodePattern::Variable(v) = &pattern.predicate {
variables.insert(v);
}
if let TermPattern::Variable(v) = &pattern.object {
variables.insert(v);
} else if let TermPattern::BlankNode(bnode) = &pattern.object {
blank_nodes.insert(bnode);
match &pattern.object {
TermPattern::NamedNode(_) | TermPattern::Literal(_) => (),
TermPattern::BlankNode(bnode) => {
blank_nodes.insert(bnode);
}
TermPattern::Variable(v) => {
variables.insert(v);
}
TermPattern::Triple(t) => add_pattern_variables(t, variables, blank_nodes),
}
}

Loading…
Cancel
Save