From 4da0e165b5d6a7d9900ae4fbc55edc3b4bc617a8 Mon Sep 17 00:00:00 2001 From: Martin Ledvinka Date: Fri, 30 Jun 2023 16:11:30 +0200 Subject: [PATCH] [Enhancement #161] Support attribute language tag extraction (and comparison) in SOQL. --- .../src/main/antlr4/cz/cvut/kbss/jopa/query/soql/Soql.g4 | 1 + .../java/cz/cvut/kbss/jopa/query/soql/SoqlConstants.java | 5 +++++ .../kbss/jopa/query/soql/SoqlFunctionTranslator.java | 1 + .../kbss/jopa/environment/utils/MetamodelFactory.java | 1 + .../cvut/kbss/jopa/query/soql/SoqlQueryParserTest.java | 9 +++++++++ 5 files changed, 17 insertions(+) diff --git a/jopa-impl/src/main/antlr4/cz/cvut/kbss/jopa/query/soql/Soql.g4 b/jopa-impl/src/main/antlr4/cz/cvut/kbss/jopa/query/soql/Soql.g4 index ac9ba1fc3..880e9fc37 100644 --- a/jopa-impl/src/main/antlr4/cz/cvut/kbss/jopa/query/soql/Soql.g4 +++ b/jopa-impl/src/main/antlr4/cz/cvut/kbss/jopa/query/soql/Soql.g4 @@ -102,6 +102,7 @@ functionsReturningStrings | 'SUBSTRING' '(' stringExpression ',' simpleArithmeticExpression ',' simpleArithmeticExpression ')' | 'LOWER' '(' stringExpression ')' | 'UPPER' '(' stringExpression ')' + | 'LANG' '(' whereClauseParam ')' ; simpleArithmeticExpression diff --git a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlConstants.java b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlConstants.java index 337b0036e..ee2631d67 100644 --- a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlConstants.java +++ b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlConstants.java @@ -121,6 +121,11 @@ public static class Functions { */ public static final String FLOOR = "FLOOR"; + /** + * Returns language tag of a literal, if it has one. Returns an empty string if it has no language tag. + */ + public static final String LANG = "LANG"; + private Functions() { throw new AssertionError(); } diff --git a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlFunctionTranslator.java b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlFunctionTranslator.java index f48befa7e..037f8f76d 100644 --- a/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlFunctionTranslator.java +++ b/jopa-impl/src/main/java/cz/cvut/kbss/jopa/query/soql/SoqlFunctionTranslator.java @@ -35,6 +35,7 @@ private static Map initFunctions() { map.put(SoqlConstants.Functions.ABS, "ABS"); map.put(SoqlConstants.Functions.CEIL, "CEIL"); map.put(SoqlConstants.Functions.FLOOR, "FLOOR"); + map.put(SoqlConstants.Functions.LANG, "lang"); return map; } diff --git a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/environment/utils/MetamodelFactory.java b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/environment/utils/MetamodelFactory.java index a8f58a1fb..544d544e0 100644 --- a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/environment/utils/MetamodelFactory.java +++ b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/environment/utils/MetamodelFactory.java @@ -1286,6 +1286,7 @@ static void initOwlClassUMocks(IdentifiableEntityType et, SingularAtt when(et.getJavaType()).thenReturn(OWLClassU.class); when(id.getJavaField()).thenReturn(OWLClassU.getIdField()); when(id.getDeclaringType()).thenReturn(et); + when(id.getName()).thenReturn(OWLClassU.getIdField().getName()); when(et.getIRI()).thenReturn(IRI.create(OWLClassU.getClassIri())); when(et.getName()).thenReturn(OWLClassU.class.getSimpleName()); when(et.getFieldSpecifications()) diff --git a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/query/soql/SoqlQueryParserTest.java b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/query/soql/SoqlQueryParserTest.java index 4581a62df..e63adf941 100644 --- a/jopa-impl/src/test/java/cz/cvut/kbss/jopa/query/soql/SoqlQueryParserTest.java +++ b/jopa-impl/src/test/java/cz/cvut/kbss/jopa/query/soql/SoqlQueryParserTest.java @@ -739,4 +739,13 @@ void parseQueryWithRelatedAttributeAndIdentifierIsCommutative() { parseAndAssertEquality(soqlIdFirst, expectedSparql); parseAndAssertEquality(soqlIdSecond, expectedSparql); } + + @Test + void parseQuerySupportsLangExtractionAndComparison() { + final String soql = "SELECT u FROM OWLClassU u WHERE LANG(u.singularStringAtt) = :language"; + final String expectedSparql = "SELECT ?x WHERE { ?x a " + strUri(Vocabulary.c_OwlClassU) + " . " + + "?x " + strUri(Vocabulary.P_U_SINGULAR_MULTILINGUAL_ATTRIBUTE) + " ?uSingularStringAtt . " + + "FILTER (lang(?uSingularStringAtt) = ?language) }"; + parseAndAssertEquality(soql, expectedSparql); + } }