Skip to content

Commit 8ed1a15

Browse files
BodmoAkron
authored andcommitted
opProx feature (Cosmas 2)
rebase on origine/master. Review Comment #181: resolved. Squashed commit consisting of - verbosity can be switched on/off on command line. - Prox: parsing %-w1 and %+w1 correctly. - opPROX: correcting order of Prox options: WIP. - beliebige Reihenfolge der Abstands-Optionen: WIP. - Prox: beliebige Reihenfolge der Optionen: OK. - Prox: beliebige Reihenfolge der Optionen: OK. - opPROX: grammar should accept any order of prox. options: WIP. - PROX: return exact error messasge about prox options. - PROX: emit a meaningfull error message: wip. - PROX: emit a meaningfull error message: WIP. - write parsing error to AST. - trying to write error message into an error node of the AST. - PROX: Fehlermeldung in KoralQuery schreiben funktioniert. - Prox... - Error detection inside Prox done. Returning a precise error message through JSON: done. - using addError() for error messages in PROX: WIP. - Prox: reporting exact error messages: works. - PROX: Tests with RecognitionExceptions removed. All Error Codes in StatusCodes.java. - Prox: error messages for wrong prox. options. - Prox: debug output deactivated. - Prox: deleted debug output. - Prox: Test added: WiP. - Prox: 1 working tests added. - Prox: 3 more tests added. changes for Review on opPROX. changes for the review. changes for the review. opPROX: PROX_REMAIN defined as a complementary class. add. test for %. Change-Id: I8802becaf840660a1512281b3477762a422f8b4f Reviewed-on: https://korap.ids-mannheim.de/gerrit/c/KorAP/Koral/+/8015 Reviewed-by: Nils Diewald <[email protected]>
1 parent a994acd commit 8ed1a15

File tree

8 files changed

+196
-56
lines changed

8 files changed

+196
-56
lines changed

Changes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
0.43 2024-06-11
2+
- [feature] Support opProx in C2 (bodmer)
3+
14
0.42 2024-01-11
25
- [feature] Support #REG in C2 (bodmer)
36
- [bugfix] Fix comma in #BED in C2 (bodmer)

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>de.ids-mannheim.korap.koral</groupId>
66
<artifactId>Koral</artifactId>
7-
<version>0.42.0</version>
7+
<version>0.43.0</version>
88
<packaging>jar</packaging>
99
<name>Koral</name>
1010
<url>https://korap.ids-mannheim.de</url>

src/main/antlr/cosmas/c2ps_opPROX.g

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ DISTVALUE
3838
// e.g. /w5umin -> remain = 'umin'.
3939

4040
PROX_REMAIN
41-
: (',')? ('b'..'h'|'j'..'l'|'n'|'o'|'q'|'r'|'u'|'v'|'y'|'z'|'B'..'H'|'J'..'L'|'N'|'O'|'Q'|'R'|'U'|'V'|'Y'|'Z') (~ ' ')* ;
42-
41+
: ~(','|'a'|'i'|'m'|'n'|'p'|'s'|'t'|'w'|'x'|'A'|'I'|'M'|'N'|'P'|'S'|'T'|'W'|'X'|'0'..'9'|'+'|'-'|':'|'/'|'%') (~ ' ')* ;
42+
4343
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
4444
//
4545
// PROX-Parser
@@ -102,4 +102,4 @@ proxGroup
102102
| ('max'|'MAX') -> ^(GRP MAX);
103103

104104

105-
105+

src/main/java/de/ids_mannheim/korap/query/parse/cosmas/c2ps_opPROX.java

Lines changed: 113 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,121 @@
1515
public class c2ps_opPROX
1616

1717
{
18-
final static boolean bDebug = false;
18+
final static boolean
19+
bDebug = false;
20+
21+
public static final int MLANG_ENGLISH = 0;
22+
public static final int MLANG_GERMAN = 1;
23+
24+
public static int
25+
messLang = MLANG_ENGLISH; // default.
1926

2027
// type of an Error CommonToken:
21-
final static int typeERROR = 1;
28+
final static int
29+
typeERROR = 1;
30+
2231
// Prox error codes defined in StatusCodes.java.
2332

33+
private static String getErrMessEN(int errCode, String text)
34+
35+
{
36+
switch( errCode )
37+
{
38+
case StatusCodes.ERR_PROX_MEAS_NULL:
39+
return String.format("Proximity operator at '%s': one of the following prox. types is missing: w,s,p!", text);
40+
41+
case StatusCodes.ERR_PROX_MEAS_TOOGREAT:
42+
return String.format("Proximity operator at '%s': Please, specify only 1 of the following prox. types: w,s,p! " +
43+
"It is possible to specify several at once by separating them with a ','. E.g.: ' /+w2,s2,p0 '.", text);
44+
45+
case StatusCodes.ERR_PROX_VAL_NULL:
46+
return String.format("Proximity operator at '%s': please specify a numerical value for the distance. E.g. ' /+w5 '.", text);
47+
48+
case StatusCodes.ERR_PROX_VAL_TOOGREAT:
49+
return String.format("Proximity operator at '%s': please specify only 1 distance value. E.g. ' /+w5 '.", text);
50+
51+
case StatusCodes.ERR_PROX_DIR_TOOGREAT:
52+
return String.format("Proximity operator at '%s': please specify either '+' or '-' or none of them for the direction.", text);
53+
54+
case StatusCodes.ERR_PROX_WRONG_CHARS:
55+
return String.format("Proximity operator at '%s': unknown proximity options!", text);
56+
57+
case StatusCodes.UNKNOWN_QUERY_ERROR:
58+
return String.format("Unknown error!");
59+
60+
default:
61+
return String.format("Proximity operator at '%s': unknown error. The correct syntax looks like this: E.g. ' /+w2 ' or ' /w10,s0 '.", text);
62+
}
63+
}
64+
65+
private static String getErrMessGE(int errCode, String text)
66+
67+
{
68+
switch( errCode )
69+
{
70+
case StatusCodes.ERR_PROX_MEAS_NULL:
71+
return String.format("Abstandsoperator an der Stelle '%s': es fehlt eine der folgenden Angaben: w,s,p!", text);
72+
73+
case StatusCodes.ERR_PROX_MEAS_TOOGREAT:
74+
return String.format("Abstandsoperator an der Stelle '%s': Bitte nur 1 der folgenden Angaben einsetzen: w,s,p! " +
75+
"Falls Mehrfachangabe erwünscht, müssen diese durch Kommata getrennt werden (z.B.: ' /+w2,s2,p0 ').", text);
76+
77+
case StatusCodes.ERR_PROX_VAL_NULL:
78+
return String.format("Abstandsoperator an der Stelle '%s': Bitte einen numerischen Wert einsetzen (z.B. ' /+w5 ')! ", text);
79+
80+
case StatusCodes.ERR_PROX_VAL_TOOGREAT:
81+
return String.format("Abstandsoperator an der Stelle '%s': Bitte nur 1 numerischen Wert einsetzen (z.B. ' /+w5 ')! ", text);
82+
83+
case StatusCodes.ERR_PROX_DIR_TOOGREAT:
84+
return String.format("Abstandsoperator an der Stelle '%s': Bitte nur 1 Angabe '+' oder '-' oder keine! ", text);
85+
86+
case StatusCodes.ERR_PROX_WRONG_CHARS:
87+
return String.format("Abstandsoperator an der Stelle '%s': unbekannte Abstandsoption(en)!", text);
88+
89+
case StatusCodes.UNKNOWN_QUERY_ERROR:
90+
return String.format("Unbekannter Fehler!");
91+
92+
default:
93+
return String.format("Abstandsoperator an der Stelle '%s': unbekannter Fehler. Korrekte Syntax z.B.: ' /+w2 ' oder ' /w10,s0 '.", text);
94+
}
95+
}
96+
97+
private static String getErrMess(int errCode, int messLang, String text)
98+
99+
{
100+
if( messLang == c2ps_opPROX.MLANG_GERMAN )
101+
return getErrMessGE(errCode, text);
102+
else
103+
return getErrMessEN(errCode, text);
104+
}
105+
106+
107+
/**
108+
* in this version, the pre-stored message language is used.
109+
* @param errCode
110+
* @param text
111+
* @return
112+
* 10.06.24/FB
113+
*/
114+
115+
public static String getErrMess(int errCode, String text)
116+
117+
{
118+
if( messLang == c2ps_opPROX.MLANG_GERMAN )
119+
return getErrMessGE(errCode, text);
120+
else
121+
return getErrMessEN(errCode, text);
122+
}
123+
124+
/**
125+
* buildErrorTree():
126+
* @param text = part of the query that contains an error.
127+
* @param errCode
128+
* @param typeDIST
129+
* @param pos
130+
* @return
131+
*/
132+
24133
private static CommonTree buildErrorTree(String text, int errCode, int typeDIST, int pos)
25134

26135
{
@@ -37,38 +146,8 @@ private static CommonTree buildErrorTree(String text, int errCode, int typeDIST,
37146
String
38147
mess;
39148

40-
switch( errCode )
41-
{
42-
case StatusCodes.ERR_PROX_MEAS_NULL:
43-
mess = String.format("Abstandsoperator an der Stelle '%s' es fehlt eine der folgenden Angaben: w,s,p!", text);
44-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
45-
break;
46-
case StatusCodes.ERR_PROX_MEAS_TOOGREAT:
47-
mess = String.format("Abstandsoperator an der Stelle '%s': Bitte nur 1 der folgenden Angaben einsetzen: w,s,p! " +
48-
"Falls Mehrfachangabe erwünscht, müssen diese durch Kommata getrennt werden (z.B.: /+w2,s0).", text);
49-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
50-
break;
51-
case StatusCodes.ERR_PROX_VAL_NULL:
52-
mess = String.format("Abstandsoperator an der Stelle '%s': Bitte einen numerischen Wert einsetzen (z.B. /+w5)! ", text);
53-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
54-
break;
55-
case StatusCodes.ERR_PROX_VAL_TOOGREAT:
56-
mess = String.format("Abstandsoperator an der Stelle '%s': Bitte nur 1 numerischen Wert einsetzen (z.B. /+w5)! ", text);
57-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
58-
break;
59-
case StatusCodes.ERR_PROX_DIR_TOOGREAT:
60-
mess = String.format("Abstandsoperator an der Stelle '%s': Bitte nur 1 Angabe '+' oder '-' oder keine! ", text);
61-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
62-
break;
63-
case StatusCodes.ERR_PROX_WRONG_CHARS:
64-
mess = String.format("Abstandsoperator an der Stelle '%s': unbekannte Abstandsoption(en)!", text);
65-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
66-
break;
67-
default:
68-
mess = String.format("Abstandsoperator an der Stelle '%s': unbekannter Fehler. Korrekte Syntax z.B.: /+w2 oder /w10,s0.", text);
69-
70-
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
71-
}
149+
mess = getErrMess(errCode, messLang, text);
150+
errorMes = new CommonTree(new CommonToken(typeERROR, mess));
72151

73152
errorTree.addChild(errorNode);
74153
errorNode.addChild(errorPos);

src/main/java/de/ids_mannheim/korap/query/serialize/Cosmas2QueryProcessor.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import de.ids_mannheim.korap.query.object.KoralOperation;
1010
import de.ids_mannheim.korap.query.object.KoralTermGroupRelation;
1111
import de.ids_mannheim.korap.query.object.KoralType;
12+
import de.ids_mannheim.korap.query.parse.cosmas.c2ps_opPROX;
1213
import de.ids_mannheim.korap.query.parse.cosmas.c2psLexer;
1314
import de.ids_mannheim.korap.query.parse.cosmas.c2psParser;
1415
import de.ids_mannheim.korap.query.serialize.util.Antlr3DescriptiveErrorListener;
@@ -150,7 +151,7 @@ public class Cosmas2QueryProcessor extends Antlr3AbstractQueryProcessor {
150151
private boolean reportErrorsinTree(Tree node)
151152

152153
{
153-
final String func = "reportErrorsinTree";
154+
// not used when not debugging: final String func = "reportErrorsinTree";
154155

155156
//System.err.printf("Debug: %s: '%s' has %d children.\n",
156157
// func, node.getText(), node.getChildCount());
@@ -178,8 +179,8 @@ private boolean reportErrorsinTree(Tree node)
178179
int
179180
errCode = node.getChild(1) != null ? Integer.parseInt(node.getChild(1).getText()) : StatusCodes.ERR_PROX_UNKNOWN;
180181
String
181-
errMess = node.getChild(2) != null ? node.getChild(2).getText() : "Genaue Fehlermeldung nicht auffindbar.";
182-
182+
errMess = node.getChild(2) != null ? node.getChild(2).getText() : c2ps_opPROX.getErrMess(StatusCodes.UNKNOWN_QUERY_ERROR, "");
183+
183184
ArrayList<Object>
184185
errorSpecs = new ArrayList<Object>();
185186

@@ -1844,9 +1845,6 @@ private Tree parseCosmasQuery (String query) {
18441845
org.antlr.runtime.CommonTokenStream tokens =
18451846
new org.antlr.runtime.CommonTokenStream(lex); // v3
18461847

1847-
// System.out.printf("parseCosmasQuery: tokens = %d\n", tokens.size());
1848-
// System.out.printf("parseCosmasQuery: tokens = %s\n", tokens.toString());
1849-
18501848
parser = new c2psParser(tokens);
18511849

18521850
// Use custom error reporters

src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import de.ids_mannheim.korap.query.serialize.util.KoralObjectGenerator;
1919
import de.ids_mannheim.korap.query.serialize.util.StatusCodes;
2020

21-
import com.fasterxml.jackson.core.JsonPointer;
22-
2321
/**
2422
* Main class for Koral, serializes queries from concrete QLs to KoralQuery
2523
*
@@ -116,11 +114,9 @@ public static void main (String[] args) {
116114
queries = new String[] { args[0] };
117115
ql = args[1];
118116
}
119-
if( args.length >= 3 )
120-
{
121-
if( args[2].compareToIgnoreCase("-show") == 0 )
122-
bDebug = true;
123-
}
117+
118+
if( args.length >= 3 && args[2].compareToIgnoreCase("-show") == 0 )
119+
bDebug = true;
124120

125121
for (String q : queries) {
126122
i++;
@@ -153,7 +149,7 @@ public static void main (String[] args) {
153149
* 'poliqarpplus', 'cqp', 'cosmas2', 'annis' or 'cql'.
154150
* @throws IOException
155151
*/
156-
152+
157153
public void run (String query, String queryLanguage, boolean bDebug) throws IOException {
158154

159155
ast.verbose = bDebug; // debugging: 01.09.23/FB

src/main/java/de/ids_mannheim/korap/util/C2RecognitionException.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
public final class C2RecognitionException extends RecognitionException {
1111

12-
private static final boolean DEBUG = false;
1312
public String mismatchedToken;
1413

1514
public C2RecognitionException(String mismatchedToken)

src/test/java/de/ids_mannheim/korap/test/cosmas2/Cosmas2QueryProcessorTest.java

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@ public void testOPNOT () throws JsonProcessingException, IOException {
513513

514514
@Test
515515
public void testOPPROX () throws JsonProcessingException, IOException {
516+
516517
query = "Sonne /+w1:4 Mond";
517518
qs.setQuery(query, "cosmas2");
518519
res = mapper.readTree(qs.toJSON());
@@ -630,31 +631,95 @@ public void testOPPROX () throws JsonProcessingException, IOException {
630631
.asText());
631632
assertFalse(res.at("/query/inOrder").asBoolean());
632633

633-
// 15.01.24/FB: checking syntax error detectiong:
634+
// -- check exclude operator -- //
635+
636+
query = "Sonne %-w1:2 Sterne";
637+
qs.setQuery(query, "cosmas2");
638+
res = mapper.readTree(qs.toJSON());
639+
640+
/*
641+
System.out.printf("Query '%s': returns: '%s'.\n", query, res.toPrettyString()) ;
642+
System.out.printf("[0]: '%s'.\n", res.at("/query/distances").get(0).get("boundary").toPrettyString());
643+
System.out.printf("@type: '%s'.\n", res.at("/query/distances").get(0).get("@type").asText());
644+
System.out.printf("exclude: '%s'.\n", res.at("/query/distances").get(0).get("exclude").asText());
645+
System.out.printf("key: '%s'.\n", res.at("/query/distances").get(0).get("key").asText());
646+
*/
647+
648+
assertEquals("cosmas:distance", res.at("/query/distances").get(0).get("@type").asText());
649+
assertTrue( res.at("/query/distances").get(0).get("exclude").asBoolean());
650+
assertEquals("w", res.at("/query/distances").get(0).get("key").asText());
651+
652+
// 15.01.24/FB: checking syntax error:
634653

635654
query = "Sonne /+w Mond"; // distance value missing.
636655
qs.setQuery(query, "cosmas2");
637656
res = mapper.readTree(qs.toJSON());
638657

639658
assertTrue(res.get("errors") != null);
659+
//System.out.printf("Query '%s': errors : '%s'.\n", query, res.get("errors").toPrettyString()) ;
660+
assertEquals(StatusCodes.ERR_PROX_VAL_NULL, res.get("errors").get(0).get(0).asInt());
640661

641662
query = "Sonne /+2sw Mond"; // 2 distance types instead of 1.
642663
qs.setQuery(query, "cosmas2");
643664
res = mapper.readTree(qs.toJSON());
644-
665+
645666
assertTrue(res.get("errors") != null);
667+
//System.out.printf("Query '%s': errors : '%s'.\n", query, res.get("errors").toPrettyString()) ;
668+
assertEquals(StatusCodes.ERR_PROX_MEAS_TOOGREAT, res.get("errors").get(0).get(0).asInt());
646669

647670
query = "Sonne /+2s- Mond"; // 2 distance directions instead of 1.
648671
qs.setQuery(query, "cosmas2");
649672
res = mapper.readTree(qs.toJSON());
650673

651674
assertTrue(res.get("errors") != null);
652-
675+
//System.out.printf("Query '%s': errors : '%s'.\n", query, res.get("errors").toPrettyString()) ;
676+
assertEquals(StatusCodes.ERR_PROX_DIR_TOOGREAT, res.get("errors").get(0).get(0).asInt());
677+
653678
query = "Sonne /+2s7 Mond"; // 2 distance values instead of 1.
654679
qs.setQuery(query, "cosmas2");
655680
res = mapper.readTree(qs.toJSON());
656681

657682
assertTrue(res.get("errors") != null);
683+
//System.out.printf("Query '%s': errors : '%s'.\n", query, res.get("errors").toPrettyString()) ;
684+
assertEquals(StatusCodes.ERR_PROX_VAL_TOOGREAT, res.get("errors").get(0).get(0).asInt());
685+
686+
// tests for error messages for unknown proximity options:
687+
// 29.05.24/FB
688+
689+
query = "ab /+w1:2u,p cd";
690+
qs.setQuery(query, "cosmas2");
691+
res = mapper.readTree(qs.toJSON());
692+
693+
assertTrue("Error code expected!",!res.get("errors").isNull());
694+
assertEquals(StatusCodes.ERR_PROX_WRONG_CHARS, res.get("errors").get(0).get(0).asInt());
695+
696+
query = "ab %-w1:2,2su cd";
697+
qs.setQuery(query, "cosmas2");
698+
res = mapper.readTree(qs.toJSON());
699+
700+
assertTrue("Error code expected!",!res.get("errors").isNull());
701+
assertEquals(StatusCodes.ERR_PROX_WRONG_CHARS, res.get("errors").get(0).get(0).asInt());
702+
703+
query = "ab /w1:2s cd";
704+
qs.setQuery(query, "cosmas2");
705+
res = mapper.readTree(qs.toJSON());
706+
707+
//System.out.printf("Query '%s': context: '%s'.\n", query, res.get("@context").toPrettyString()) ;
708+
//System.out.printf("Query '%s': errors : '%s'.\n", query, res.get("errors").toPrettyString()) ;
709+
//System.out.printf("Query '%s': errorCode: '%s'.\n", query, res.get("errors").get(0).get(0).toPrettyString()) ;
710+
//System.out.printf("Query '%s': errorText : '%s'.\n", query, res.get("errors").get(0).get(1).toPrettyString()) ;
711+
//System.out.printf("Query '%s': errorPos : '%s'.\n", query, res.get("errors").get(0).get(2).toPrettyString()) ;
712+
713+
assertTrue("Error code expected!", res.get("errors") != null);
714+
assertEquals(StatusCodes.ERR_PROX_MEAS_TOOGREAT, res.get("errors").get(0).get(0).asInt());
715+
716+
query = "Sonne %-w1:2,+2su Galaxien";
717+
qs.setQuery(query, "cosmas2");
718+
res = mapper.readTree(qs.toJSON());
719+
720+
assertTrue("Error code expected!", res.get("errors") != null);
721+
assertEquals(StatusCodes.ERR_PROX_WRONG_CHARS, res.get("errors").get(0).get(0).asInt());
722+
658723
}
659724

660725

0 commit comments

Comments
 (0)