diff --git a/src/main/java/models/terms/meta/MatchConstraint.java b/src/main/java/models/terms/meta/MatchConstraint.java index bf0061d..fca74c1 100644 --- a/src/main/java/models/terms/meta/MatchConstraint.java +++ b/src/main/java/models/terms/meta/MatchConstraint.java @@ -21,7 +21,11 @@ } public Map getOrderConstraint() { - return new HashMap<>(orderConstraint); + Map res = new HashMap<>(); + for (var key : orderConstraint.keySet()) { + res.put(key, (OrderVariableConstraint) orderConstraint.get(key).clone()); + } + return res; } } diff --git a/src/main/java/models/terms/meta/MetaDependencyGenerator.java b/src/main/java/models/terms/meta/MetaDependencyGenerator.java index ed0c6e7..d90f8e0 100644 --- a/src/main/java/models/terms/meta/MetaDependencyGenerator.java +++ b/src/main/java/models/terms/meta/MetaDependencyGenerator.java @@ -1,8 +1,10 @@ package models.terms.meta; +import models.terms.RDLTerm; + @FunctionalInterface public interface MetaDependencyGenerator { - MetaRDLTerm generate(int i); + RDLTerm generate(int i); } diff --git a/src/main/java/models/terms/meta/MetaDependencyTermGenerator.java b/src/main/java/models/terms/meta/MetaDependencyTermGenerator.java index 197ccd1..07c1ef8 100644 --- a/src/main/java/models/terms/meta/MetaDependencyTermGenerator.java +++ b/src/main/java/models/terms/meta/MetaDependencyTermGenerator.java @@ -1,9 +1,11 @@ package models.terms.meta; +import models.terms.RDLTerm; + @FunctionalInterface public interface MetaDependencyTermGenerator { - record TermPair(MetaRDLTerm dependedTerm, MetaRDLTerm argTerm) {}; + record TermPair(RDLTerm dependedTerm, RDLTerm argTerm) {}; TermPair generate(int i); diff --git a/src/main/java/models/terms/meta/MetaRDLTerm.java b/src/main/java/models/terms/meta/MetaRDLTerm.java index ccdb3ea..e067d9c 100644 --- a/src/main/java/models/terms/meta/MetaRDLTerm.java +++ b/src/main/java/models/terms/meta/MetaRDLTerm.java @@ -26,6 +26,7 @@ import models.terms.LinearRightNormalizedType; import models.terms.RDLTerm; import models.terms.Resource; +import models.terms.meta.MetaDependencyTermGenerator.TermPair; import utils.Permutation; public class MetaRDLTerm extends RDLTerm { @@ -58,6 +59,7 @@ } this.size = size; this.termType = TermType.META_DEPENDENCY; + this.metaDependencyGenerator = (i) -> (RDLTerm) this.getChild(i + 1); } public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaRDLTerm dependedTerm) { @@ -104,6 +106,7 @@ addChild(argTerm); } this.termType = TermType.META_DEPENDENCY_TERM; + this.metaDependencyTermGenerator = (i) -> new TermPair((RDLTerm) this.getChild(i * 2 + 1), (RDLTerm) this.getChild(i * 2 + 2)); } public MetaRDLTerm(MetaRDLTerm dependingTerm, MetaRDLTerm ...terms) { @@ -168,38 +171,36 @@ public Set isMatchedBy(RDLTerm another, MatchConstraint constraint) { Set result = new HashSet<>(); - Map binding = constraint.getBinding(); - Map orderConstraint = constraint.getOrderConstraint(); if (! another.getClass().isAssignableFrom(this.termType.getBaseTermClass())) { return result; } - if (this.getChildren().size() != another.getChildren().size()) { + if (!isDynamic && this.getChildren().size() != another.getChildren().size()) { return result; } if (isDependencyTerm() && (! islinearRightNormalizedMatchedBy(another))) { return result; } - if (isDependencyTerm() && !isVariable()) { - RDLTerm dependingChild = (RDLTerm) this.getChild(0); - RDLTerm anotherDependingChild = (RDLTerm) another.getChild(0); - Set res = new HashSet<>(); - if (dependingChild instanceof MetaRDLTerm) { - MetaRDLTerm metaChild = (MetaRDLTerm) dependingChild; - res = metaChild.isMatchedBy(anotherDependingChild, constraint); - } else { - if (!(dependingChild.equals(anotherDependingChild))) { - return result; - } + RDLTerm dependingChild = (RDLTerm) this.getChild(0); + RDLTerm anotherDependingChild = (RDLTerm) another.getChild(0); + Set res = new HashSet<>(); + if (dependingChild instanceof MetaRDLTerm) { + MetaRDLTerm metaChild = (MetaRDLTerm) dependingChild; + res = metaChild.isMatchedBy(anotherDependingChild, constraint); + } else { + if (!(dependingChild.equals(anotherDependingChild))) { + return result; } - for (List perm : Permutation.permutation((getChildren().size() - 1) / 2)) { - MatchConstraint constraint2 = new MatchConstraint(binding, orderConstraint); + } + if (isDependencyTerm() && !isVariable()) { + for (List perm : Permutation.permutation((another.getChildren().size() - 1) / 2)) { Set res2 = new HashSet<>(res); boolean flg = true; - for (int i = 0; i < (getChildren().size() - 1) / 2; i++) { + for (int i = 0; i < perm.size(); i++) { int j = perm.get(i); - RDLTerm dependedChild = (RDLTerm) this.getChild(j * 2 + 1); + TermPair termPair = this.metaDependencyTermGenerator.generate(j); + RDLTerm dependedChild = termPair.dependedTerm(); + RDLTerm argChild = termPair.argTerm(); RDLTerm anotherDependedChild = (RDLTerm) another.getChild(i * 2 + 1); - RDLTerm argChild = (RDLTerm) this.getChild(j * 2 + 2); RDLTerm anotherArgChild = (RDLTerm) another.getChild(i * 2 + 2); if (dependedChild instanceof MetaRDLTerm) { MetaRDLTerm metaChild = (MetaRDLTerm) dependedChild; @@ -234,27 +235,12 @@ } return result; } else if (isDependency() && !isVariable()) { - RDLTerm dependingChild = (RDLTerm) this.getChild(0); - RDLTerm anotherDependingChild = (RDLTerm) another.getChild(0); - Set res = new HashSet<>(); - if (dependingChild instanceof MetaRDLTerm) { - MetaRDLTerm metaChild = (MetaRDLTerm) dependingChild; - res = metaChild.isMatchedBy(anotherDependingChild, constraint); - if (res.isEmpty()) { - return result; - } - } else { - if (!(dependingChild.equals(anotherDependingChild))) { - return result; - } - } - for (List perm : Permutation.permutation(getChildren().size() - 1)) { - MatchConstraint constraint2 = new MatchConstraint(binding, orderConstraint); + for (List perm : Permutation.permutation(another.getChildren().size() - 1)) { Set res2 = new HashSet<>(res); boolean flg = true; - for (int i = 0; i < getChildren().size() - 1; i++) { + for (int i = 0; i < perm.size(); i++) { int j = perm.get(i); - RDLTerm dependedChild = (RDLTerm) this.getChild(j + 1); + RDLTerm dependedChild = this.metaDependencyGenerator.generate(j); RDLTerm anotherDependedChild = (RDLTerm) another.getChild(i + 1); if (dependedChild instanceof MetaRDLTerm) { MetaRDLTerm metaChild = (MetaRDLTerm) dependedChild; @@ -276,33 +262,9 @@ } return result; } -// } else { -// for (int i = 0; i < this.getChildren().size(); i++) { -// RDLTerm child = (RDLTerm) this.getChild(i); -// RDLTerm anotherChild = (RDLTerm) another.getChild(i); -// if (child instanceof MetaRDLTerm) { -// MetaRDLTerm metaChild = (MetaRDLTerm) child; -// if (metaChild.isMatchedBy(anotherChild, constraint).isEmpty()) { -// return result; -// } -// } else { -// if (!(child.equals(anotherChild))) { -// return result; -// } -// } -// } -// return result; -// } return result; } - private boolean dynamicMatchCheck(RDLTerm another, Map binding, Map orderConstraint) { - if (isDependency()) { - - } - return false; - } - public boolean checkTermType(Class clazz) { return clazz.isAssignableFrom(termType.getBaseTermClass()); } diff --git a/src/main/java/models/terms/meta/OrderVariableConstraint.java b/src/main/java/models/terms/meta/OrderVariableConstraint.java index 7a80c79..10cda04 100644 --- a/src/main/java/models/terms/meta/OrderVariableConstraint.java +++ b/src/main/java/models/terms/meta/OrderVariableConstraint.java @@ -60,6 +60,11 @@ } @Override + public String toString() { + return "[" + lower + ", " + (upper + 1) + ")"; + } + + @Override public Object clone() { OrderVariableConstraint constraint = new OrderVariableConstraint(); constraint.isOk = isOk; diff --git a/src/test/java/terms/DependencyTermTest.java b/src/test/java/terms/DependencyTermTest.java index c90f686..df85bf3 100644 --- a/src/test/java/terms/DependencyTermTest.java +++ b/src/test/java/terms/DependencyTermTest.java @@ -13,6 +13,8 @@ import models.terms.RDLTerm; import models.terms.Resource; import models.terms.meta.MatchConstraint; +import models.terms.meta.MetaDependencyTermGenerator; +import models.terms.meta.MetaDependencyTermGenerator.TermPair; import models.terms.meta.MetaRDLTerm; import models.terms.meta.MetaResource; import models.terms.meta.OrderVariableConstraint; @@ -109,6 +111,38 @@ } @Test + void DynamicMatchTest() { + Resource a1 = new Resource("a1", Utils.INT, 3); + Resource a2 = new Resource("a2", Utils.INT, 1); + Resource a3 = new Resource("a3", Utils.INT, 4); + Resource a4 = new Resource("a4", Utils.INT, 2); + Resource a5 = new Resource("a5", Utils.INT, 4); + DependencyTerm t1 = new DependencyTerm(a1, a2, a3, a4, a5); + MetaResource x = new MetaResource(new Variable("x"), new Variable("n")); + MetaRDLTerm mt1 = new MetaRDLTerm(x, + (MetaDependencyTermGenerator) (i) -> + new TermPair( + new MetaResource(new Variable("x" + (2*i + 1)), Utils.parse("n-1-" + i)), + new MetaResource(new Variable("x" + (2*i + 2)), Utils.parse("n+1")) + ) + ); + Set tmp = mt1.isMatchedBy(t1); + System.out.println(tmp); + + assertTrue(! tmp.isEmpty()); + } + + @Test + void DynamicMatchTest2() { + MetaResource x = new MetaResource(new Variable("x")); + MetaRDLTerm mt1 = new MetaRDLTerm(x, (MetaDependencyTermGenerator) (i) -> new TermPair(new MetaResource(new Variable("x" + i)), new MetaResource(new Variable("y"+i)))); + DependencyTerm d1 = new DependencyTerm(a, b, c); + DependencyTerm d2 = new DependencyTerm(a, b, c, d, e); + assertTrue(! mt1.isMatchedBy(d1).isEmpty()); + assertTrue(! mt1.isMatchedBy(d2).isEmpty()); + } + + @Test void OrderTest() { Resource text = new Resource("text", Utils.INT, 2); Resource wNo = new Resource("wNo", Utils.INT, 2);