
io.mindmaps.graql.internal.pattern.ConjunctionImpl Maven / Gradle / Ivy
/*
* MindmapsDB - A Distributed Semantic Database
* Copyright (C) 2016 Mindmaps Research Ltd
*
* MindmapsDB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MindmapsDB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MindmapsDB. If not, see .
*/
package io.mindmaps.graql.internal.pattern;
import com.google.common.collect.Sets;
import io.mindmaps.graql.admin.Conjunction;
import io.mindmaps.graql.admin.Disjunction;
import io.mindmaps.graql.admin.PatternAdmin;
import io.mindmaps.graql.admin.VarAdmin;
import java.util.List;
import java.util.Set;
import static java.util.stream.Collectors.*;
class ConjunctionImpl implements Conjunction {
private final Set patterns;
ConjunctionImpl(Set patterns) {
this.patterns = patterns;
}
@Override
public Set getPatterns() {
return patterns;
}
@Override
public Disjunction> getDisjunctiveNormalForm() {
// Get all disjunctions in query
List>> disjunctionsOfConjunctions = patterns.stream()
.map(p -> p.getDisjunctiveNormalForm().getPatterns())
.collect(toList());
// Get the cartesian product.
// in other words, this puts the 'ands' on the inside and the 'ors' on the outside
// e.g. (A or B) and (C or D) <=> (A and C) or (A and D) or (B and C) or (B and D)
Set> dnf = Sets.cartesianProduct(disjunctionsOfConjunctions).stream()
.map(ConjunctionImpl::fromConjunctions)
.collect(toSet());
return Patterns.disjunction(dnf);
// Wasn't that a horrible function? Here it is in Haskell:
// dnf = map fromConjunctions . sequence . map getDisjunctiveNormalForm . patterns
}
@Override
public boolean isConjunction() {
return true;
}
@Override
public Conjunction> asConjunction() {
return this;
}
private static Conjunction fromConjunctions(List> conjunctions) {
Set patterns = conjunctions.stream().flatMap(p -> p.getPatterns().stream()).collect(toSet());
return Patterns.conjunction(patterns);
}
@Override
public boolean equals(Object obj) {
return (obj instanceof ConjunctionImpl) && patterns.equals(((ConjunctionImpl) obj).patterns);
}
@Override
public int hashCode() {
return patterns.hashCode();
}
@Override
public String toString() {
return "{" + patterns.stream().map(s -> s + ";").collect(joining(" ")) + "}";
}
@Override
public PatternAdmin admin() {
return this;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy