Merge branch 'master' of ssh://korap.ids-mannheim.de:29418/KorAP/Koral
diff --git a/README.md b/README.md
index db6206e..4711bea 100644
--- a/README.md
+++ b/README.md
@@ -103,7 +103,14 @@
There is also a command line version. After installation, simply run
java -jar target/Koral-0.2.jar [query] [queryLanguage]
-
+
+## Prerequisites
+
+Java 7 (OpenJDK or Oracle JDK with [JCE] (http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html))
+[Git](http://git-scm.com/),
+At least [Maven 3.2.1](https://maven.apache.org/).
+Further dependencies are resolved by Maven.
+
## Authorship
Koral and KoralQuery were developed by Joachim Bingel,
diff --git a/pom.xml b/pom.xml
index e59fd5c..453f107 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,271 +1,274 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
- <groupId>de.ids_mannheim.korap</groupId>
- <artifactId>Koral</artifactId>
- <version>0.22</version>
- <packaging>jar</packaging>
- <name>Koral</name>
- <url>http://maven.apache.org</url>
+ <groupId>de.ids_mannheim.korap</groupId>
+ <artifactId>Koral</artifactId>
+ <version>0.22</version>
+ <packaging>jar</packaging>
+ <name>Koral</name>
+ <url>http://maven.apache.org</url>
- <organization>
- <name>IDS Mannheim</name>
- <url>http://www.ids-mannheim.de/</url>
- </organization>
+ <organization>
+ <name>IDS Mannheim</name>
+ <url>http://www.ids-mannheim.de/</url>
+ </organization>
- <developers>
- <developer>
- <name>Joachim Bingel</name>
- <email>bingel@ids-mannheim.de</email>
- </developer>
- <developer>
- <name>Nils Diewald</name>
- <email>diewald@ids-mannheim.de</email>
- <url>http://nils-diewald.de</url>
- </developer>
- <developer>
- <name>Michael Hanl</name>
- <email>hanl@ids-mannheim.de</email>
- </developer>
- <developer>
- <name>Eliza Margaretha</name>
- <email>margaretha@ids-mannheim.de</email>
- </developer>
- </developers>
+ <developers>
+ <developer>
+ <name>Joachim Bingel</name>
+ <email>bingel@ids-mannheim.de</email>
+ </developer>
+ <developer>
+ <name>Nils Diewald</name>
+ <email>diewald@ids-mannheim.de</email>
+ <url>http://nils-diewald.de</url>
+ </developer>
+ <developer>
+ <name>Michael Hanl</name>
+ <email>hanl@ids-mannheim.de</email>
+ </developer>
+ <developer>
+ <name>Eliza Margaretha</name>
+ <email>margaretha@ids-mannheim.de</email>
+ </developer>
+ </developers>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
- <repositories>
- <repository>
- <id>id-maven-repo</id>
- <url>http://maven.indexdata.com</url>
- </repository>
- </repositories>
- <dependencies>
- <dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr4-runtime</artifactId>
- <version>4.2</version>
- </dependency>
- <dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr4-runtime</artifactId>
- <version>4.5.1</version>
- </dependency>
- <dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr4-maven-plugin</artifactId>
- <version>4.2</version>
- </dependency>
- <dependency>
- <groupId>org.antlr</groupId>
- <artifactId>antlr-runtime</artifactId>
- <version>3.5</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>15.0</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.3.3</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>2.3.3</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.3.3</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.6</version>
- </dependency>
- <dependency>
- <groupId>org.z3950.zing</groupId>
- <artifactId>cql-java</artifactId>
- <version>1.12</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>apache-log4j-extras</artifactId>
- <version>1.2.17</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.7.5</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.5</version>
- </dependency>
- <dependency>
- <groupId>eu.clarin.sru.fcs</groupId>
- <artifactId>fcs-simple-endpoint</artifactId>
- <version>1.3.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-core</artifactId>
- <version>5.2.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-analyzers-common</artifactId>
- <version>5.2.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-queryparser</artifactId>
- <version>5.2.1</version>
- </dependency>
- </dependencies>
- <build>
- <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
- <outputDirectory>${basedir}/target/classes</outputDirectory>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.3</version>
- <configuration>
- <compilerVersion>1.7</compilerVersion>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- </plugin>
- <!--
- Formatter plugin for Eclipse based coding conventions
- http://maven-java-formatter-plugin.googlecode.com/svn/site/0.4/usage.html
- -->
- <plugin>
- <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
- <artifactId>maven-java-formatter-plugin</artifactId>
- <version>0.4</version>
- <configuration>
- <configFile>${project.basedir}/Format.xml</configFile>
- <overrideConfigCompilerVersion>true</overrideConfigCompilerVersion>
- <compilerSource>1.7</compilerSource>
- <compilerCompliance>1.7</compilerCompliance>
- <compilerTargetPlatform>1.7</compilerTargetPlatform>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <phase>install</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <outputDirectory>${project.build.directory}/../lib</outputDirectory>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.5</version>
- <configuration>
- <archive>
- <manifest>
- <addClasspath>true</addClasspath>
- <classpathPrefix>../lib/</classpathPrefix>
- <mainClass>de.ids_mannheim.korap.query.serialize.QuerySerializer</mainClass>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <!-- This plugin will help to build the ANTLR4 grammar on the fly. The
- recipe is based on http://stackoverflow.com/questions/15310628/ customize-maven-to-automatically-create-antlr4-grammar-java-files-on-build -->
- <groupId>org.antlr</groupId>
- <artifactId>antlr4-maven-plugin</artifactId>
- <version>4.2</version>
- <executions>
- <execution>
- <id>poliqarpplus</id>
- <goals>
- <goal>antlr4</goal>
- </goals>
- <configuration>
- <sourceDirectory>${basedir}/src/main/antlr/poliqarpplus</sourceDirectory>
- <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/poliqarpplus</outputDirectory>
- <libDirectory>${basedir}/src/main/antlr/poliqarpplus</libDirectory>
- </configuration>
- <phase>generate-sources</phase>
- </execution>
- <execution>
- <id>annis</id>
- <goals>
- <goal>antlr4</goal>
- </goals>
- <configuration>
- <sourceDirectory>${basedir}/src/main/antlr/annis</sourceDirectory>
- <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/annis</outputDirectory>
- <libDirectory>${basedir}/src/main/antlr/annis</libDirectory>
- </configuration>
- <phase>generate-sources</phase>
- </execution>
- <execution>
- <id>collection</id>
- <goals>
- <goal>antlr4</goal>
- </goals>
- <configuration>
- <sourceDirectory>${basedir}/src/main/antlr/collection</sourceDirectory>
- <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/collection</outputDirectory>
- <libDirectory>${basedir}/src/main/antlr/collection</libDirectory>
- </configuration>
- <phase>generate-sources</phase>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <!-- This plugin will help to build the ANTLR3 grammar on the fly. The
- recipe is based on http://stackoverflow.com/questions/15310628/ customize-maven-to-automatically-create-antlr4-grammar-java-files-on-build -->
- <groupId>org.antlr</groupId>
- <artifactId>antlr3-maven-plugin</artifactId>
- <version>3.5.1</version>
- <configuration>
- <sourceDirectory>${basedir}/src/main/antlr/cosmas</sourceDirectory>
- <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/cosmas</outputDirectory>
- <libDirectory>${basedir}/src/main/antlr</libDirectory>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>antlr</goal>
- </goals>
- <phase>generate-sources</phase>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ <repositories>
+ <repository>
+ <id>id-maven-repo</id>
+ <url>http://maven.indexdata.com</url>
+ </repository>
+ <repository>
+ <id>CLARIN</id>
+ <name>CLARIN Repository</name>
+ <url>https://nexus.clarin.eu/content/repositories/Clarin</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+ <dependencies>
+ <!-- <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId>
+ <version>4.2</version> </dependency> -->
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr4-runtime</artifactId>
+ <version>4.5.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr4-maven-plugin</artifactId>
+ <version>4.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr-runtime</artifactId>
+ <version>3.5</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>15.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.3.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>2.3.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.3.3</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.6</version>
+ </dependency>
+ <dependency>
+ <groupId>org.z3950.zing</groupId>
+ <artifactId>cql-java</artifactId>
+ <version>1.12</version>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.17</version>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>apache-log4j-extras</artifactId>
+ <version>1.2.17</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.7.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.7.5</version>
+ </dependency>
+ <dependency>
+ <groupId>eu.clarin.sru.fcs</groupId>
+ <artifactId>fcs-simple-endpoint</artifactId>
+ <version>1.3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.lucene</groupId>
+ <artifactId>lucene-core</artifactId>
+ <version>5.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.lucene</groupId>
+ <artifactId>lucene-analyzers-common</artifactId>
+ <version>5.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.lucene</groupId>
+ <artifactId>lucene-queryparser</artifactId>
+ <version>5.2.1</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
+ <outputDirectory>${basedir}/target/classes</outputDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.3</version>
+ <configuration>
+ <compilerVersion>1.7</compilerVersion>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ <!-- Formatter plugin for Eclipse based coding conventions http://maven-java-formatter-plugin.googlecode.com/svn/site/0.4/usage.html -->
+ <plugin>
+ <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
+ <artifactId>maven-java-formatter-plugin</artifactId>
+ <version>0.4</version>
+ <configuration>
+ <configFile>${project.basedir}/Format.xml</configFile>
+ <overrideConfigCompilerVersion>true</overrideConfigCompilerVersion>
+ <compilerSource>1.7</compilerSource>
+ <compilerCompliance>1.7</compilerCompliance>
+ <compilerTargetPlatform>1.7</compilerTargetPlatform>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>install</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${project.build.directory}/../lib</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.5</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <classpathPrefix>../lib/</classpathPrefix>
+ <mainClass>de.ids_mannheim.korap.query.serialize.QuerySerializer</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <!-- This plugin will help to build the ANTLR4 grammar on the fly. The
+ recipe is based on http://stackoverflow.com/questions/15310628/ customize-maven-to-automatically-create-antlr4-grammar-java-files-on-build -->
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr4-maven-plugin</artifactId>
+ <version>4.2</version>
+ <executions>
+ <execution>
+ <id>poliqarpplus</id>
+ <goals>
+ <goal>antlr4</goal>
+ </goals>
+ <configuration>
+ <sourceDirectory>${basedir}/src/main/antlr/poliqarpplus</sourceDirectory>
+ <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/poliqarpplus</outputDirectory>
+ <libDirectory>${basedir}/src/main/antlr/poliqarpplus</libDirectory>
+ </configuration>
+ <phase>generate-sources</phase>
+ </execution>
+ <execution>
+ <id>annis</id>
+ <goals>
+ <goal>antlr4</goal>
+ </goals>
+ <configuration>
+ <sourceDirectory>${basedir}/src/main/antlr/annis</sourceDirectory>
+ <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/annis</outputDirectory>
+ <libDirectory>${basedir}/src/main/antlr/annis</libDirectory>
+ </configuration>
+ <phase>generate-sources</phase>
+ </execution>
+ <execution>
+ <id>collection</id>
+ <goals>
+ <goal>antlr4</goal>
+ </goals>
+ <configuration>
+ <sourceDirectory>${basedir}/src/main/antlr/collection</sourceDirectory>
+ <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/collection</outputDirectory>
+ <libDirectory>${basedir}/src/main/antlr/collection</libDirectory>
+ </configuration>
+ <phase>generate-sources</phase>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <!-- This plugin will help to build the ANTLR3 grammar on the fly. The
+ recipe is based on http://stackoverflow.com/questions/15310628/ customize-maven-to-automatically-create-antlr4-grammar-java-files-on-build -->
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr3-maven-plugin</artifactId>
+ <version>3.5.1</version>
+ <configuration>
+ <sourceDirectory>${basedir}/src/main/antlr/cosmas</sourceDirectory>
+ <outputDirectory>${basedir}/src/main/java/de/ids_mannheim/korap/query/parse/cosmas</outputDirectory>
+ <libDirectory>${basedir}/src/main/antlr</libDirectory>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>antlr</goal>
+ </goals>
+ <phase>generate-sources</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/src/main/java/de/ids_mannheim/korap/query/object/KoralBoundary.java b/src/main/java/de/ids_mannheim/korap/query/object/KoralBoundary.java
new file mode 100644
index 0000000..0faee0e
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/object/KoralBoundary.java
@@ -0,0 +1,46 @@
+package de.ids_mannheim.korap.query.object;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class KoralBoundary implements KoralObject {
+
+ private static final KoralType type = KoralType.BOUNDARY;
+
+ private int min;
+ private int max;
+
+ public KoralBoundary (int min, int max) {
+ this.min = min;
+ this.max = max;
+ }
+
+ public int getMin() {
+ return min;
+ }
+
+ public void setMin(int min) {
+ this.min = min;
+ }
+
+ public int getMax() {
+ return max;
+ }
+
+ public void setMax(int max) {
+ this.max = max;
+ }
+
+ @Override
+ public Map<String, Object> buildMap() {
+ Map<String, Object> map = new LinkedHashMap<String, Object>();
+ map.put("@type", type.toString());
+ if (min > -1) {
+ map.put("min", getMin());
+ }
+ if (max > -1) {
+ map.put("max", getMax());
+ }
+ return map;
+ }
+}
diff --git a/src/main/java/de/ids_mannheim/korap/query/object/KoralDistance.java b/src/main/java/de/ids_mannheim/korap/query/object/KoralDistance.java
new file mode 100644
index 0000000..eb88f58
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/object/KoralDistance.java
@@ -0,0 +1,69 @@
+package de.ids_mannheim.korap.query.object;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class KoralDistance implements KoralObject {
+
+ private final KoralType type = KoralType.DISTANCE;
+ private String key = "w";
+ private String foundry;
+ private String layer;
+ private KoralBoundary boundary;
+
+ public KoralDistance (KoralBoundary boundary) {
+ this.boundary = boundary;
+ }
+
+ public KoralDistance (String key, KoralBoundary boundary) {
+ this(boundary);
+ this.key = key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getFoundry() {
+ return foundry;
+ }
+
+ public void setFoundry(String foundry) {
+ this.foundry = foundry;
+ }
+
+ public String getLayer() {
+ return layer;
+ }
+
+ public void setLayer(String layer) {
+ this.layer = layer;
+ }
+
+ public KoralBoundary getBoundary() {
+ return boundary;
+ }
+
+ public void setBoundary(KoralBoundary boundary) {
+ this.boundary = boundary;
+ }
+
+ @Override
+ public Map<String, Object> buildMap() {
+ Map<String, Object> distanceMap = new LinkedHashMap<String, Object>();
+ distanceMap.put("@type", type.toString());
+ distanceMap.put("key", key);
+ if (foundry != null){
+ distanceMap.put("foundry", foundry);
+ }
+ if (layer!=null){
+ distanceMap.put("layer", layer);
+ }
+ distanceMap.put("boundary", boundary.buildMap());
+ return distanceMap;
+ }
+}
diff --git a/src/main/java/de/ids_mannheim/korap/query/object/KoralGroup.java b/src/main/java/de/ids_mannheim/korap/query/object/KoralGroup.java
index 090ecbc..b304f72 100644
--- a/src/main/java/de/ids_mannheim/korap/query/object/KoralGroup.java
+++ b/src/main/java/de/ids_mannheim/korap/query/object/KoralGroup.java
@@ -22,8 +22,9 @@
private boolean inOrder = false;
private List<KoralObject> operands;
- private List<Distance> distances;
+ private List<KoralDistance> distances;
private List<Frame> frames;
+ private KoralBoundary boundary;
public KoralGroup (KoralOperation operation) {
this.operation = operation;
@@ -45,11 +46,19 @@
this.operands = operands;
}
- public List<Distance> getDistances() {
+ public KoralOperation getOperation() {
+ return operation;
+ }
+
+ public void setOperation(KoralOperation operation) {
+ this.operation = operation;
+ }
+
+ public List<KoralDistance> getDistances() {
return distances;
}
- public void setDistances(List<Distance> distances) {
+ public void setDistances(List<KoralDistance> distances) {
this.distances = distances;
}
@@ -61,6 +70,14 @@
this.frames = frames;
}
+ public KoralBoundary getBoundary() {
+ return boundary;
+ }
+
+ public void setBoundary(KoralBoundary boundary) {
+ this.boundary = boundary;
+ }
+
@Override
public Map<String, Object> buildMap() {
Map<String, Object> map = new LinkedHashMap<String, Object>();
@@ -70,17 +87,21 @@
if (getDistances() != null) {
map.put("inOrder", isInOrder());
List<Map<String, Object>> distanceList = new ArrayList<Map<String, Object>>();
- for (Distance d : getDistances()) {
+ for (KoralDistance d : distances) {
distanceList.add(d.buildMap());
}
map.put("distances", distanceList);
}
List<Map<String, Object>> operandList = new ArrayList<Map<String, Object>>();
- for (Object o : getOperands()) {
+ for (Object o : operands) {
operandList.add(MapBuilder.buildQueryMap(o));
}
map.put("operands", operandList);
+
+ if (boundary != null) {
+ map.put("boundary", boundary.buildMap());
+ }
return map;
}
@@ -100,54 +121,4 @@
return "frame:"+value;
}
}
-
- public class Distance implements KoralObject {
-
- private final KoralType type = KoralType.DISTANCE;
- private String key;
- private String min;
- private String max;
-
- public Distance (String key, int min, int max) {
- this.key = key;
- this.min = String.valueOf(min);
- this.max = String.valueOf(max);
- }
-
- public String getKey() {
- return key;
- }
-
- public void setKey(String key) {
- this.key = key;
- }
-
- public String getMin() {
- return min;
- }
-
- public void setMin(String min) {
- this.min = min;
- }
-
- public String getMax() {
- return max;
- }
-
- public void setMax(String max) {
- this.max = max;
- }
-
- @Override
- public Map<String, Object> buildMap() {
- Map<String, Object> distanceMap = new LinkedHashMap<String, Object>();
- distanceMap.put("@type", type.toString());
- distanceMap.put("key", getKey());
- distanceMap.put("min", getMin());
- distanceMap.put("max", getMax());
- return distanceMap;
-
- }
-
- }
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/object/KoralToken.java b/src/main/java/de/ids_mannheim/korap/query/object/KoralToken.java
index 06a39ce..7798566 100644
--- a/src/main/java/de/ids_mannheim/korap/query/object/KoralToken.java
+++ b/src/main/java/de/ids_mannheim/korap/query/object/KoralToken.java
@@ -15,6 +15,8 @@
private final static KoralType type = KoralType.TOKEN;
private KoralObject wrappedObject;
+ public KoralToken () {}
+
public KoralToken (KoralObject wrappedObject) {
this.wrappedObject = wrappedObject;
}
@@ -30,7 +32,9 @@
public Map<String, Object> buildMap() {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("@type", type.toString());
- map.put("wrap", wrappedObject.buildMap());
+ if (wrappedObject != null){
+ map.put("wrap", wrappedObject.buildMap());
+ }
return map;
}
}
diff --git a/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/ExpressionParser.java b/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/ExpressionParser.java
index 488b4c8..42f5f83 100644
--- a/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/ExpressionParser.java
+++ b/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/ExpressionParser.java
@@ -20,6 +20,7 @@
import eu.clarin.sru.server.fcs.parser.ExpressionGroup;
import eu.clarin.sru.server.fcs.parser.ExpressionNot;
import eu.clarin.sru.server.fcs.parser.ExpressionOr;
+import eu.clarin.sru.server.fcs.parser.ExpressionWildcard;
import eu.clarin.sru.server.fcs.parser.Operator;
import eu.clarin.sru.server.fcs.parser.QueryNode;
import eu.clarin.sru.server.fcs.parser.RegexFlag;
@@ -76,9 +77,9 @@
return parseBooleanExpression(operands, KoralRelation.OR);
}
}
- // else if (queryNode instanceof ExpressionWildcard) {
- // for distance query, using empty token
- // }
+ else if (queryNode instanceof ExpressionWildcard) {
+ return new KoralToken();
+ }
else {
throw new KoralException(StatusCodes.QUERY_TOO_COMPLEX,
"FCS diagnostic 11: Query is too complex.");
diff --git a/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/FCSSRUQueryParser.java b/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/FCSSRUQueryParser.java
index 85be144..92f535c 100644
--- a/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/FCSSRUQueryParser.java
+++ b/src/main/java/de/ids_mannheim/korap/query/parse/fcsql/FCSSRUQueryParser.java
@@ -7,12 +7,15 @@
import de.ids_mannheim.korap.query.object.KoralContext;
import de.ids_mannheim.korap.query.serialize.util.KoralException;
import de.ids_mannheim.korap.query.serialize.util.StatusCodes;
+import de.ids_mannheim.korap.query.object.KoralBoundary;
import de.ids_mannheim.korap.query.object.KoralGroup;
+import de.ids_mannheim.korap.query.object.KoralDistance;
import de.ids_mannheim.korap.query.object.KoralObject;
import de.ids_mannheim.korap.query.object.KoralOperation;
import de.ids_mannheim.korap.query.object.KoralSpan;
import de.ids_mannheim.korap.query.object.KoralTerm;
import de.ids_mannheim.korap.query.object.KoralGroup.Frame;
+import eu.clarin.sru.server.fcs.parser.ExpressionWildcard;
import eu.clarin.sru.server.fcs.parser.QueryDisjunction;
import eu.clarin.sru.server.fcs.parser.QueryGroup;
import eu.clarin.sru.server.fcs.parser.QueryNode;
@@ -34,7 +37,8 @@
this.expressionParser = new ExpressionParser();
}
- public KoralObject parseQueryNode(QueryNode queryNode) throws KoralException {
+ public KoralObject parseQueryNode(QueryNode queryNode)
+ throws KoralException {
if (queryNode instanceof QuerySegment) {
return parseQuerySegment((QuerySegment) queryNode);
@@ -43,63 +47,64 @@
return parseQueryNode(queryNode.getChild(0));
}
else if (queryNode instanceof QuerySequence) {
- return parseGroupQuery(queryNode.getChildren(),
- KoralOperation.SEQUENCE);
+ return parseSequenceQuery(queryNode.getChildren());
}
else if (queryNode instanceof QueryDisjunction) {
return parseGroupQuery(queryNode.getChildren(),
KoralOperation.DISJUNCTION);
}
else if (queryNode instanceof QueryWithWithin) {
- return parseWithinQuery((QueryWithWithin)queryNode);
+ return parseWithinQuery((QueryWithWithin) queryNode);
}
else if (queryNode instanceof SimpleWithin) {
- SimpleWithin withinNode = (SimpleWithin) queryNode;
- return parseWithinScope(withinNode.getScope());
- }
+ SimpleWithin withinNode = (SimpleWithin) queryNode;
+ return parseWithinScope(withinNode.getScope());
+ }
else {
throw new KoralException(StatusCodes.QUERY_TOO_COMPLEX,
"FCS diagnostic 11:" + queryNode.getNodeType().name()
+ " is currently unsupported.");
}
}
- private KoralObject parseWithinQuery(QueryWithWithin queryNode) throws KoralException {
- KoralGroup koralGroup = new KoralGroup(KoralOperation.POSITION);
- koralGroup.setFrames(Arrays.asList(Frame.IS_AROUND));
-
- List<KoralObject> operands = new ArrayList<KoralObject>();
- operands.add(parseQueryNode(queryNode.getWithin()));
- operands.add(parseQueryNode(queryNode.getQuery()));
- koralGroup.setOperands(operands);
- return koralGroup;
- }
- private KoralSpan parseWithinScope(Scope scope) throws KoralException{
- if (scope == null){
- throw new KoralException(StatusCodes.MALFORMED_QUERY,
+ private KoralObject parseWithinQuery(QueryWithWithin queryNode)
+ throws KoralException {
+ KoralGroup koralGroup = new KoralGroup(KoralOperation.POSITION);
+ koralGroup.setFrames(Arrays.asList(Frame.IS_AROUND));
+
+ List<KoralObject> operands = new ArrayList<KoralObject>();
+ operands.add(parseQueryNode(queryNode.getWithin()));
+ operands.add(parseQueryNode(queryNode.getQuery()));
+ koralGroup.setOperands(operands);
+ return koralGroup;
+ }
+
+ private KoralSpan parseWithinScope(Scope scope) throws KoralException {
+ if (scope == null) {
+ throw new KoralException(StatusCodes.MALFORMED_QUERY,
"FCS diagnostic 11: Within context is missing.");
- }
+ }
- KoralContext contextSpan;
- if (scope == Scope.SENTENCE) {
- contextSpan = KoralContext.SENTENCE;
- }
- else if (scope == Scope.PARAGRAPH){
- contextSpan = KoralContext.PARAGRAPH;
- }
- else if (scope == Scope.TEXT){
+ KoralContext contextSpan;
+ if (scope == Scope.SENTENCE) {
+ contextSpan = KoralContext.SENTENCE;
+ }
+ else if (scope == Scope.PARAGRAPH) {
+ contextSpan = KoralContext.PARAGRAPH;
+ }
+ else if (scope == Scope.TEXT) {
contextSpan = KoralContext.TEXT;
- }
- else{
- throw new KoralException(StatusCodes.QUERY_TOO_COMPLEX,
+ }
+ else {
+ throw new KoralException(StatusCodes.QUERY_TOO_COMPLEX,
"FCS diagnostic 11: Within scope " + scope.toString()
+ " is currently unsupported.");
- }
-
- return new KoralSpan(new KoralTerm(contextSpan));
+ }
+
+ return new KoralSpan(new KoralTerm(contextSpan));
}
-
- private KoralGroup parseGroupQuery(List<QueryNode> children,
+
+ private KoralGroup parseGroupQuery(List<QueryNode> children,
KoralOperation operation) throws KoralException {
KoralGroup koralGroup = new KoralGroup(operation);
List<KoralObject> operands = new ArrayList<KoralObject>();
@@ -110,13 +115,131 @@
return koralGroup;
}
- private KoralObject parseQuerySegment(QuerySegment segment) throws KoralException {
- if ((segment.getMinOccurs() == 1) && (segment.getMaxOccurs() == 1)) {
+ private KoralGroup parseSequenceQuery(List<QueryNode> children)
+ throws KoralException {
+ KoralGroup koralGroup = new KoralGroup(KoralOperation.SEQUENCE);
+ List<KoralObject> operands = new ArrayList<KoralObject>();
+ KoralObject operand;
+
+ boolean isEmptyTokenFound = false;
+ boolean isLastTokenEmpty = false;
+ int size = children.size();
+
+ for (int i = 0; i < size; i++) {
+ QueryNode child = children.get(i);
+ if (i > 0 && i < size - 1 && findEmptyToken(child)) {
+ QuerySegment qs = (QuerySegment) child;
+ if (isLastTokenEmpty) {
+ updateBoundary(operands.get(operands.size() - 1), qs);
+ }
+ else {
+ operands.add(new KoralBoundary(qs.getMinOccurs(), qs
+ .getMaxOccurs()));
+ isLastTokenEmpty = true;
+ }
+ isEmptyTokenFound = true;
+ continue;
+ }
+ operand = parseQueryNode(child);
+ operands.add(operand);
+ isLastTokenEmpty = false;
+ }
+
+ if (isEmptyTokenFound) {
+ //operands = updateOperands(operands);
+ operands = createDistance(koralGroup,operands);
+ }
+
+ koralGroup.setOperands(operands);
+ return koralGroup;
+ }
+
+ private boolean findEmptyToken(QueryNode child) {
+ if (child instanceof QuerySegment
+ && ((QuerySegment) child).getExpression() instanceof ExpressionWildcard) {
+ return true;
+ }
+ return false;
+ }
+
+ private void updateBoundary(KoralObject koralObject, QuerySegment qs) {
+ KoralBoundary boundary = (KoralBoundary) koralObject;
+ boundary.setMin(boundary.getMin() + qs.getMinOccurs());
+ boundary.setMax(boundary.getMax() + qs.getMaxOccurs());
+ }
+
+ private List<KoralObject> createDistance(KoralGroup koralGroup, List<KoralObject> operands){
+ boolean isLastOperandUpdated = false;
+ boolean isDistanceSet = false;
+ List<KoralObject> newOperands = new ArrayList<KoralObject>(
+ operands.size());
+ newOperands.add(operands.get(0));
+ int operandSize = operands.size();
+ for (int i = 1; i < operandSize - 1; i++) {
+ KoralObject operand = operands.get(i);
+ if (operand instanceof KoralBoundary) {
+ if (isDistanceSet){
+
+ }
+ else{
+ List<KoralDistance> distances = new ArrayList<KoralDistance>(1);
+ distances.add(new KoralDistance((KoralBoundary) operand));
+ koralGroup.setDistances(distances);
+ }
+ isLastOperandUpdated = true;
+ }
+ isLastOperandUpdated = false;
+ }
+ if (!isLastOperandUpdated){
+ newOperands.add(operands.get(operandSize-1));
+ }
+ return newOperands;
+ }
+
+ private List<KoralObject> updateOperands(List<KoralObject> operands) {
+ boolean isLastOperandUpdated = false;
+ List<KoralObject> newOperands = new ArrayList<KoralObject>(
+ operands.size());
+ newOperands.add(operands.get(0));
+ int operandSize = operands.size();
+ for (int i = 1; i < operandSize - 1; i++) {
+ KoralObject operand = operands.get(i);
+ if (operand instanceof KoralBoundary) {
+ KoralGroup koralGroup = new KoralGroup(KoralOperation.SEQUENCE);
+ List<KoralDistance> distances = new ArrayList<KoralDistance>(1);
+ distances.add(new KoralDistance((KoralBoundary) operand));
+ koralGroup.setDistances(distances);
+ koralGroup.setOperands(Arrays.asList(newOperands.get(i - 1),
+ operands.get(i + 1)));
+ newOperands.set(i-1,koralGroup);
+ isLastOperandUpdated = true;
+ }
+ isLastOperandUpdated = false;
+ }
+ if (!isLastOperandUpdated){
+ newOperands.add(operands.get(operandSize-1));
+ }
+ return newOperands;
+ }
+
+ private KoralObject parseQuerySegment(QuerySegment segment)
+ throws KoralException {
+ int minOccurs = segment.getMinOccurs();
+ int maxOccurs = segment.getMaxOccurs();
+
+ if ((minOccurs == 1) && (maxOccurs == 1)) {
return expressionParser.parseExpression(segment.getExpression());
}
else {
- throw new KoralException(StatusCodes.QUERY_TOO_COMPLEX,
- "FCS diagnostic 11: Query is too complex.");
+ KoralBoundary boundary = new KoralBoundary(minOccurs, maxOccurs);
+ List<KoralObject> operand = new ArrayList<KoralObject>(1);
+ operand.add(expressionParser.parseExpression(segment
+ .getExpression()));
+
+ KoralGroup koralGroup = new KoralGroup(KoralOperation.REPETITION);
+ koralGroup.setBoundary(boundary);
+ koralGroup.setOperands(operand);
+ return koralGroup;
}
}
}
diff --git a/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLComplexTest.java b/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLComplexTest.java
index 3973aea..2493802 100644
--- a/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLComplexTest.java
+++ b/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLComplexTest.java
@@ -7,6 +7,8 @@
import org.junit.Test;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
/**
* @author margaretha
*
@@ -38,20 +40,6 @@
FCSQLQueryProcessorTest
.validateNode(query, "/query/operands/1", jsonLd);
- // sequence and disjunction
- query = "([pos=\"NN\"]|[cnx:pos=\"N\"])[text=\"Mann\"]";
- jsonLd = "{@type:koral:group,"
- + "operation:operation:sequence,"
- + "operands:["
- + "{@type:koral:group,"
- + "operation:operation:disjunction,"
- + "operands:[{@type:koral:token,wrap:{@type:koral:term,key:NN,foundry:tt,layer:p,type:type:regex,match:match:eq}},"
- + "{@type:koral:token,wrap:{@type:koral:term,key:N,foundry:cnx,layer:p,type:type:regex,match:match:eq}}"
- + "]},"
- + "{@type:koral:token,wrap:{@type:koral:term,key:Mann,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}}"
- + "]}";
- FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
-
// group and sequence
query = "([text=\"blaue\"][pos=\"NN\"])";
jsonLd = "{@type:koral:group,"
@@ -94,13 +82,6 @@
+ "{@type:koral:token, wrap:{@type:koral:term,key:NN,foundry:tt,layer:p,type:type:regex,match:match:eq}},"
+ "{@type:koral:token, wrap:{@type:koral:term,key:Mann,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}}]}";
FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
-
- query = "[pos=\"NN\"]&[text=\"Mann\"]";
- List<Object> error = FCSQLQueryProcessorTest
- .getError(new FCSQLQueryProcessor(query, "2.0"));
- assertEquals(399, error.get(0));
- String msg = (String) error.get(1);
- assertEquals(true, msg.startsWith("FCS diagnostic 10"));
}
// | simple-query main-query /* sequence */
@@ -123,11 +104,115 @@
FCSQLQueryProcessorTest
.validateNode(query, "/query/operands/1", jsonLd);
+ // sequence and disjunction
+ query = "([pos=\"NN\"]|[cnx:pos=\"N\"])[text=\"Mann\"]";
+ jsonLd = "{@type:koral:group,"
+ + "operation:operation:sequence,"
+ + "operands:["
+ + "{@type:koral:group,"
+ + "operation:operation:disjunction,"
+ + "operands:[{@type:koral:token,wrap:{@type:koral:term,key:NN,foundry:tt,layer:p,type:type:regex,match:match:eq}},"
+ + "{@type:koral:token,wrap:{@type:koral:term,key:N,foundry:cnx,layer:p,type:type:regex,match:match:eq}}"
+ + "]},"
+ + "{@type:koral:token,wrap:{@type:koral:term,key:Mann,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}}"
+ + "]}";
+ FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
+
}
// | simple-query quantifier /* quatification */
@Test
public void testQueryWithQuantifier() throws IOException {
+ // repetition
+ String query = "\"die\"{2}";
+ String jsonLd = "{@type:koral:group,"
+ + "operation:operation:repetition,"
+ + "operands:["
+ + "{@type:koral:token,wrap:{@type:koral:term,key:die,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}}],"
+ + "boundary:{@type:koral:boundary,min:2,max:2}}";
+ FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
+
+ query = "\"die\"{1,2}";
+ jsonLd = "{@type:koral:boundary,min:1,max:2}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+
+ query = "\"die\"{,2}";
+ jsonLd = "{@type:koral:boundary,min:0,max:2}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+
+ query = "\"die\"{2,}";
+ jsonLd = "{@type:koral:boundary,min:2}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+
+ query = "\"die\"+";
+ jsonLd = "{@type:koral:boundary,min:1}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+
+ query = "\"die\"?";
+ jsonLd = "{@type:koral:boundary,min:0, max:1}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+
+ query = "\"die\"*";
+ jsonLd = "{@type:koral:boundary,min:0}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+
+ query = "\"die\"{0}";
+ jsonLd = "{@type:koral:boundary,min:0, max:0}";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/boundary", jsonLd);
+ }
+
+ // wildcards
+ @Test
+ public void testQueryWithEmptyToken() throws IOException {
+ // expansion query
+ String query = "[]{2}\"Hund\"";
+ String jsonLd = "{@type:koral:group, "
+ + "operation:operation:sequence, "
+ + "operands:["
+ + "{@type:koral:group,"
+ + "operation:operation:repetition,"
+ + "operands:["
+ + "{@type:koral:token}],"
+ + "boundary:{@type:koral:boundary,min:2,max:2}},"
+ + "{@type:koral:token, "
+ + "wrap:{@type:koral:term, key:Hund, foundry:opennlp, layer:orth, type:type:regex, match:match:eq}}"
+ + "]}";
+ FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
+
+ query = "\"Hund\"[]{2}";
+ jsonLd = "{@type:koral:group," + "operation:operation:repetition,"
+ + "operands:[" + "{@type:koral:token}],"
+ + "boundary:{@type:koral:boundary,min:2,max:2}}";
+ FCSQLQueryProcessorTest
+ .validateNode(query, "/query/operands/1", jsonLd);
+
+ // arbitrary tokens
+ query = "[]{2}";
+ FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
+
+ // sequence with extension
+ query = "[cnx:pos=\"A\"] \"Hund\"[]{2}";
+ jsonLd = "["
+ + "{@type:koral:token,wrap:{@type:koral:term,key:A,foundry:cnx,layer:p,type:type:regex,match:match:eq}},"
+ + "{@type:koral:token,wrap:{@type:koral:term,key:Hund,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}},"
+ + "{@type:koral:group,operation:operation:repetition,operands:["
+ + "{@type:koral:token}],boundary:{@type:koral:boundary,min:2,max:2}}"
+ + "]";
+ FCSQLQueryProcessorTest.validateNode(query, "/query/operands", jsonLd);
+ }
+
+ @Test
+ public void testQueryWithDistance() throws JsonProcessingException {
+ // distance query
+ String query = "\"Katze\" []{3} \"Hund\"";
+ String jsonLd = "{@type:koral:group,operation:operation:sequence,inOrder:false,"
+ + "distances:["
+ + "{@type:koral:distance,key:w,boundary:{@type:koral:boundary,min:3,max:3}}"
+ + "],"
+ + "operands:["
+ + "{@type:koral:token,wrap:{@type:koral:term,key:Katze,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}},"
+ + "{@type:koral:token,wrap:{@type:koral:term,key:Hund,foundry:opennlp,layer:orth,type:type:regex,match:match:eq}}]}";
+ FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
}
@@ -169,5 +254,33 @@
"FCS diagnostic 11: Within scope UTTERANCE is currently unsupported.",
(String) error.get(1));
}
-
+
+ @Test
+ public void testWrongQuery() throws IOException {
+ String query = "!(mate:lemma=\"sein\" | mate:pos=\"PPOSS\")";
+ List<Object> error = FCSQLQueryProcessorTest
+ .getError(new FCSQLQueryProcessor(query, "2.0"));
+ assertEquals(399, error.get(0));
+ assertEquals(true,
+ error.get(1).toString().startsWith("FCS diagnostic 10"));
+
+ query = "![mate:lemma=\"sein\" | mate:pos=\"PPOSS\"]";
+ error = FCSQLQueryProcessorTest.getError(new FCSQLQueryProcessor(query,
+ "2.0"));
+ assertEquals(true,
+ error.get(1).toString().startsWith("FCS diagnostic 10"));
+
+ query = "(\"blaue\"&\"grüne\")";
+ error = FCSQLQueryProcessorTest.getError(new FCSQLQueryProcessor(query,
+ "2.0"));
+ assertEquals(true,
+ error.get(1).toString().startsWith("FCS diagnostic 10"));
+
+ query = "[pos=\"NN\"]&[text=\"Mann\"]";
+ error = FCSQLQueryProcessorTest.getError(new FCSQLQueryProcessor(query,
+ "2.0"));
+ assertEquals(399, error.get(0));
+ String msg = (String) error.get(1);
+ assertEquals(true, msg.startsWith("FCS diagnostic 10"));
+ }
}
diff --git a/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLQueryProcessorTest.java b/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLQueryProcessorTest.java
index 7fa90d0..93a130c 100644
--- a/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLQueryProcessorTest.java
+++ b/src/test/java/de/ids_mannheim/korap/query/serialize/FCSQLQueryProcessorTest.java
@@ -280,24 +280,4 @@
FCSQLQueryProcessorTest.runAndValidate(query, jsonLd);
}
-
- @Test
- public void testWrongQuery() throws IOException {
- String query = "!(mate:lemma=\"sein\" | mate:pos=\"PPOSS\")";
- List<Object> error = getError(new FCSQLQueryProcessor(query, "2.0"));
- assertEquals(399, error.get(0));
- assertEquals(true,
- error.get(1).toString().startsWith("FCS diagnostic 10"));
-
- query = "![mate:lemma=\"sein\" | mate:pos=\"PPOSS\"]";
- error = getError(new FCSQLQueryProcessor(query, "2.0"));
- assertEquals(true,
- error.get(1).toString().startsWith("FCS diagnostic 10"));
-
- query = "(\"blaue\"&\"grüne\")";
- error = getError(new FCSQLQueryProcessor(query, "2.0"));
- assertEquals(true,
- error.get(1).toString().startsWith("FCS diagnostic 10"));
- }
-
}
diff --git a/src/test/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusQueryProcessorTest.java b/src/test/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusQueryProcessorTest.java
index 095cc59..1142ae9 100644
--- a/src/test/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusQueryProcessorTest.java
+++ b/src/test/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusQueryProcessorTest.java
@@ -726,6 +726,24 @@
assertEquals("koral:token", operands.get(0).at("/@type").asText());
assertEquals(true, operands.get(0).at("/key").isMissingNode());
+ query = "[base=Mann][]";
+ qs.setQuery(query, "poliqarpplus");
+ res = mapper.readTree(qs.toJSON());
+ operands = Lists.newArrayList(res.at("/query/operands").elements());
+ assertEquals("koral:token", operands.get(1).at("/@type").asText());
+ assertEquals(true, operands.get(1).at("/key").isMissingNode());
+
+ query = "[base=Mann][]{3}";
+ qs.setQuery(query, "poliqarpplus");
+ res = mapper.readTree(qs.toJSON());
+ operands = Lists.newArrayList(res.at("/query/operands").elements());
+ res = operands.get(1);
+ assertEquals("koral:group", res.at("/@type").asText());
+ assertEquals(true, res.at("/key").isMissingNode());
+ assertEquals("operation:repetition", res.at("/operation").asText());
+ assertEquals(3, res.at("/boundary/min").asInt());
+ assertEquals(3, res.at("/boundary/max").asInt());
+
query = "startswith(<s>, [][base=Mann])";
qs.setQuery(query, "poliqarpplus");
res = mapper.readTree(qs.toJSON());