Sort focus operations on demand
Change-Id: Ia2809078a4b7c6ed485740895f77fadfa6bde2bf
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
index 959c7ff..ae2e8d5 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
@@ -99,6 +99,9 @@
buffer.append((short) classNumbers.get(0) & 0xFF).append(": ");
}
buffer.append(this.firstClause.toString());
+ if (!this.isSorted()) {
+ buffer.append(",sorting");
+ }
buffer.append(')');
buffer.append(ToStringUtils.boost(getBoost()));
return buffer.toString();
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
index 9b71cbf..4ed669f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
@@ -1,23 +1,16 @@
package de.ids_mannheim.korap.query.wrap;
-import de.ids_mannheim.korap.query.wrap.SpanRegexQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanWildcardQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanSegmentQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanSimpleQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.lucene.search.spans.SpanOrQuery;
+import org.apache.lucene.search.spans.SpanQuery;
import de.ids_mannheim.korap.util.QueryException;
-import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.search.spans.SpanTermQuery;
-import org.apache.lucene.search.spans.SpanOrQuery;
-import org.apache.lucene.index.Term;
-
-import java.util.*;
-
public class SpanAlterQueryWrapper extends SpanQueryWrapper {
private String field;
- private SpanQuery query;
private List<SpanQueryWrapper> alternatives;
@@ -27,18 +20,10 @@
};
- public SpanAlterQueryWrapper (String field, SpanQuery query) {
- this.field = field;
- this.alternatives = new ArrayList<>();
- this.alternatives.add(new SpanSimpleQueryWrapper(query));
- };
-
-
public SpanAlterQueryWrapper (String field, SpanQueryWrapper query) {
this.field = field;
this.alternatives = new ArrayList<>();
- if (query.maybeUnsorted())
- this.maybeUnsorted = true;
+ this.maybeUnsorted = query.maybeUnsorted();
this.alternatives.add(query);
};
@@ -48,21 +33,16 @@
this.alternatives = new ArrayList<>();
for (String term : terms) {
this.isNull = false;
- this.alternatives.add(new SpanSimpleQueryWrapper(
- new SpanTermQuery(new Term(this.field, term))));
+ this.alternatives.add(
+ new SpanSimpleQueryWrapper(this.field, term)
+ );
};
};
public SpanAlterQueryWrapper or (String term) {
- return this.or(new SpanTermQuery(new Term(this.field, term)));
- };
-
-
- public SpanAlterQueryWrapper or (SpanQuery query) {
- this.alternatives.add(new SpanSimpleQueryWrapper(query));
- this.isNull = false;
- return this;
+ SpanQueryWrapper sqw = new SpanSimpleQueryWrapper(this.field, term);
+ return this.or(sqw);
};
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
index d2941f9..0e22fd7 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
@@ -31,8 +31,7 @@
this.isNegative = true;
};
- if (sqw.maybeUnsorted())
- this.maybeUnsorted = true;
+ this.maybeUnsorted = sqw.maybeUnsorted();
};
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
index c06194f..ff9ae05 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
@@ -18,6 +18,7 @@
this.number = number;
if (number != (byte) 0)
this.hasClass = true;
+ this.maybeUnsorted = subquery.maybeUnsorted();
};
@@ -59,13 +60,6 @@
return this.subquery.isNegative();
};
-
- @Override
- public boolean maybeUnsorted () {
- return this.subquery.maybeUnsorted();
- };
-
-
public SpanQuery toFragmentQuery () throws QueryException {
if (this.subquery.isNull())
return (SpanQuery) null;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java
index 3112dc2..811d0e3 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java
@@ -15,7 +15,7 @@
*/
public class SpanElementQueryWrapper extends SpanQueryWrapper {
- String element;
+ protected String element;
String field;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java
index f4011c2..a445781 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java
@@ -1,15 +1,10 @@
package de.ids_mannheim.korap.query.wrap;
-import org.apache.lucene.search.RegexpQuery;
import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.util.automaton.RegExp;
-import org.apache.lucene.index.Term;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
+
import de.ids_mannheim.korap.query.SpanExpansionQuery;
import de.ids_mannheim.korap.util.QueryException;
-import java.util.*;
-
/*
* TODO: SpanExpansionQueryWrapper currently does not support negative extensions!
*/
@@ -40,6 +35,7 @@
this.isExtended = true;
if (direction >= 0)
this.isExtendedToTheRight = true;
+ this.maybeUnsorted = anchor.maybeUnsorted();
};
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
index 89d8f65..2c3a39a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
@@ -2,24 +2,11 @@
import org.apache.lucene.search.spans.SpanQuery;
+import de.ids_mannheim.korap.query.SpanFocusQuery;
import de.ids_mannheim.korap.util.QueryException;
-import de.ids_mannheim.korap.query.SpanFocusQuery;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
-
-import java.util.*;
-
-// Support maybeUnsorted!
-// Rename this to SpanFocusQueryWrapper
// Support multiple classes
-// Sorting:
-// - Sort with a buffer of matches, e.g. 25/50,
-// So gather 50 hits, sort them, return the first 25,
-// Add new 25, sort the last 50, return 25 etc.
-// On processing, there should be an ability to raise
-// a warning, in case an unordered result bubbles up.
-
public class SpanFocusQueryWrapper extends SpanQueryWrapper {
private SpanQueryWrapper subquery;
private byte number;
@@ -52,9 +39,16 @@
public SpanQuery toFragmentQuery () throws QueryException {
if (this.subquery.isNull())
return (SpanQuery) null;
- return new SpanFocusQuery(
- this.subquery.retrieveNode(this.retrieveNode).toFragmentQuery(),
- this.number);
+
+ SpanFocusQuery sfq = new SpanFocusQuery(
+ this.subquery.retrieveNode(this.retrieveNode).toFragmentQuery(),
+ this.number);
+
+ if (this.subquery.maybeUnsorted())
+ sfq.setSorted(false);
+
+ return sfq;
+
};
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
index 20d19ff..4fca2a6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
@@ -72,9 +72,18 @@
// Wrap the query in a <base/s=t>, if it's extended to the right
if (this.isExtendedToTheRight()) {
- return new SpanFocusQuery(new SpanWithinQuery("base/s:t",
+ SpanFocusQuery sfc = new SpanFocusQuery(new SpanWithinQuery("base/s:t",
new SpanClassQuery(this.toFragmentQuery(), (byte) 254)),
(byte) 254);
+
+ // Only sort, in case it wraps an unsorted query,
+ // within base/s:t is sorted per definition.
+ if (this.maybeUnsorted()) {
+ sfc.setSorted(false);
+ };
+
+ return sfc;
+
};
SpanQuery sq = this.toFragmentQuery();
@@ -280,7 +289,7 @@
* Normally spans are always sorted, but in case of
* a wrapped relation query, classed operands may
* be in arbitrary order. When focussing on these
- * classes, the span has to me reordered.
+ * classes, the span has to be reordered.
*
* @return <tt>true</tt> in case the wrapped query
* has to be sorted on focussing,
@@ -429,7 +438,8 @@
+ (this.isEmpty() ? "isEmpty" : "notEmpty") + "-"
+ (this.isOptional() ? "isOptional" : "notOptional") + "-"
+ (this.isExtendedToTheRight() ? "isExtendedToTheRight"
- : "notExtendedToTheRight");;
+ : "notExtendedToTheRight") + "-"
+ + (this.maybeUnsorted() ? "maybeUnsorted" : "notUnsorted");
return string;
};
};
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java
index c874fef..830fbfe 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java
@@ -30,6 +30,7 @@
"Class number must be bigger than 0.");
}
this.classNum = classNum;
+ this.maybeUnsorted = subQueryWrapper.maybeUnsorted();
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java
index 30ea49b..a3ed45a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java
@@ -1,13 +1,10 @@
package de.ids_mannheim.korap.query.wrap;
-import org.apache.lucene.search.RegexpQuery;
-import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
-import org.apache.lucene.util.automaton.RegExp;
import org.apache.lucene.index.Term;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
-
-import java.util.*;
+import org.apache.lucene.search.RegexpQuery;
+import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
+import org.apache.lucene.search.spans.SpanQuery;
+import org.apache.lucene.util.automaton.RegExp;
/*
TODO: Don't allow queries like ".*?"!!!
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java
index fe980c9..c87d551 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java
@@ -1,8 +1,6 @@
package de.ids_mannheim.korap.query.wrap;
-import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.search.spans.SpanTermQuery;
import de.ids_mannheim.korap.constants.RelationDirection;
import de.ids_mannheim.korap.query.SpanFocusQuery;
@@ -35,6 +33,7 @@
this.subQuery1 = operand1;
this.subQuery2 = operand2;
+ this.maybeUnsorted = true;
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
index ec88b04..4279640 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
@@ -30,8 +30,7 @@
if (!subquery.isEmpty()) {
this.subquery = subquery;
- if (subquery.maybeUnsorted())
- this.maybeUnsorted = true;
+ this.maybeUnsorted = subquery.maybeUnsorted();
this.isEmpty = false;
}
else
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
index 8623671..18752ce 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
@@ -1,18 +1,13 @@
package de.ids_mannheim.korap.query.wrap;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Iterator;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.search.spans.SpanTermQuery;
import org.apache.lucene.search.spans.SpanNotQuery;
import org.apache.lucene.search.spans.SpanOrQuery;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanRegexQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanWildcardQueryWrapper;
-import de.ids_mannheim.korap.query.SpanSegmentQuery;
+import org.apache.lucene.search.spans.SpanQuery;
+import de.ids_mannheim.korap.query.SpanSegmentQuery;
import de.ids_mannheim.korap.util.QueryException;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
index b457d77..a8673fc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
@@ -99,20 +99,6 @@
/**
* Constructs a new object for sequence deserialization
- * by passing a single {@link SpanQuery} object.
- *
- * @param query
- * Initial {@link SpanQuery} to search for.
- */
- public SpanSequenceQueryWrapper (SpanQuery query) {
- this(query.getField());
- this.segments.add(new SpanSimpleQueryWrapper(query));
- this.isNull = false;
- };
-
-
- /**
- * Constructs a new object for sequence deserialization
* by passing a single {@link SpanQueryWrapper} object.
* These wrapper queries may be optional, negative, or empty.
*
@@ -126,8 +112,7 @@
if (sswq.isNull())
return;
- if (sswq.maybeUnsorted())
- this.maybeUnsorted = true;
+ this.maybeUnsorted = sswq.maybeUnsorted();
// Some debugging on initiating new sequences
if (DEBUG) {
@@ -168,20 +153,9 @@
* chaining.
*/
public SpanSequenceQueryWrapper append (String term) {
- return this.append(new SpanTermQuery(new Term(field, term)));
- };
-
-
- /**
- * Append a new {@link SpanQuery} object to the sequence.
- *
- * @param query
- * A new {@link SpanQuery} to search for.
- * @return The {@link SpanSequenceQueryWrapper} object for
- * chaining.
- */
- public SpanSequenceQueryWrapper append (SpanQuery query) {
- return this.append(new SpanSimpleQueryWrapper(query));
+ return this.append(
+ new SpanSimpleQueryWrapper(field, term)
+ );
};
@@ -258,20 +232,9 @@
* chaining.
*/
public SpanSequenceQueryWrapper prepend (String term) {
- return this.prepend(new SpanTermQuery(new Term(field, term)));
- };
-
-
- /**
- * Prepend a new {@link SpanQuery} object to the sequence.
- *
- * @param query
- * A new {@link SpanQuery} to search for.
- * @return The {@link SpanSequenceQueryWrapper} object for
- * chaining.
- */
- public SpanSequenceQueryWrapper prepend (SpanQuery query) {
- return this.prepend(new SpanSimpleQueryWrapper(query));
+ return this.prepend(
+ new SpanSimpleQueryWrapper(field, term)
+ );
};
@@ -580,6 +543,8 @@
*/
public void setInOrder (boolean order) {
this.isInOrder = order;
+ if (order == false)
+ this.maybeUnsorted = true;
};
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
index 7e91844..eb370e3 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
@@ -48,6 +48,7 @@
else if (subquery.isNegative()) {
handleNegativeSubquery();
}
+ this.maybeUnsorted = sqw.maybeUnsorted();
}
@@ -144,10 +145,4 @@
return false;
return this.subquery.isOptional();
};
-
-
- @Override
- public boolean maybeUnsorted () {
- return this.subquery.maybeUnsorted();
- };
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java
index 5ac346e..faba7fc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java
@@ -1,12 +1,9 @@
package de.ids_mannheim.korap.query.wrap;
-import org.apache.lucene.search.WildcardQuery;
-import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
import org.apache.lucene.index.Term;
-
-import java.util.*;
+import org.apache.lucene.search.WildcardQuery;
+import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
+import org.apache.lucene.search.spans.SpanQuery;
public class SpanWildcardQueryWrapper extends SpanQueryWrapper {
private SpanQuery query;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
index 266e051..efb476d 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
@@ -37,7 +37,9 @@
"The query requires a positive attribute.");
}
this.attrQueryWrapper = attrQuery;
+ this.maybeUnsorted = attrQuery.maybeUnsorted();
this.isSingleAttribute = true;
+
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
index ceb58f2..b601fac 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
@@ -1,17 +1,10 @@
package de.ids_mannheim.korap.query.wrap;
-import de.ids_mannheim.korap.query.SpanWithinQuery;
-import de.ids_mannheim.korap.query.wrap.SpanSegmentQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanRegexQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanSequenceQueryWrapper;
-import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
-
-import de.ids_mannheim.korap.util.QueryException;
-
-import java.util.*;
-
import org.apache.lucene.search.spans.SpanQuery;
+import de.ids_mannheim.korap.query.SpanWithinQuery;
+import de.ids_mannheim.korap.util.QueryException;
+
/*
Todo:
@@ -121,7 +114,15 @@
if (this.element.maybeUnsorted())
return true;
- return this.maybeUnsorted;
+ if (this.flag == SpanWithinQuery.MATCH ||
+ this.flag == SpanWithinQuery.STARTSWITH) {
+ return false;
+ };
+
+ // TODO:
+ // Optimize by checking for containing classes!
+
+ return true;
};