Skip to content

Commit

Permalink
subject from|constant #153
Browse files Browse the repository at this point in the history
- subject from __
- subject constant __
- graphs from __
  • Loading branch information
mchlrch committed Apr 17, 2024
1 parent d668d42 commit a225b62
Show file tree
Hide file tree
Showing 27 changed files with 332 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,23 @@ public EditorTest() {
super("editortest.xrm");
}

@Test
public void keywordsFromConstantTemplateOffered() {
MarkerContext ctx = this.marker("keywordsFromConstantTemplateOffered");
PositionContext position = ctx.nextLineWithTextAfter("subject");

CompletionExpectationBuilder b = new CompletionExpectationBuilder();

b.keyword("constant", position);
b.keyword("from", position);
b.keyword("template", position);

testCompletion((TestCompletionConfiguration it) -> {
position.configure(it);
it.setExpectedCompletionItems(b.toExpectedCompletionItems());
});
}

@Test
public void getProposalOfTemplatesDefinedInThisFileTest() {
MarkerContext ctx = this.marker("getProposalOfTemplatesDefinedInThisFile");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,40 @@ public EditorTestCsvTest() {
super("editortest-csv.xrm");
}

@Test
public void noSubjectFromOnCsvTest() {
MarkerContext ctx = this.marker("noSubjectFromOrConstantOnCsv");
PositionContext position = ctx.nextLineWithTextAfter("subject");

CompletionExpectationBuilder b = new CompletionExpectationBuilder();

this.assertionMode(AssertEqualsMode.EXPECTED_ABSENT_IN_ACTUAL);

b.keyword("from", position);

testCompletion((TestCompletionConfiguration it) -> {
position.configure(it);
it.setExpectedCompletionItems(b.toExpectedCompletionItems());
});
}

@Test
public void noSubjectConstantOnCsvTest() {
MarkerContext ctx = this.marker("noSubjectFromOrConstantOnCsv");
PositionContext position = ctx.nextLineWithTextAfter("subject");

CompletionExpectationBuilder b = new CompletionExpectationBuilder();

this.assertionMode(AssertEqualsMode.EXPECTED_ABSENT_IN_ACTUAL);

b.keyword("constant", position);

testCompletion((TestCompletionConfiguration it) -> {
position.configure(it);
it.setExpectedCompletionItems(b.toExpectedCompletionItems());
});
}

@Test
public void noParentTriplesMapOnCsvTest() {
MarkerContext ctx = this.marker("noParentTriplesMapOnCsv");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public void noAsOnTemplateValueInGraphMappingsTest() {
CompletionExpectationBuilder b = new CompletionExpectationBuilder();

b.ref("id", Referenceable.class, position);
b.ref("someIri", Referenceable.class, position);
b.keyword(";", position);
// NOT b.keyword("as", position);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import java.util.Collection;
import java.util.Set;

import jakarta.inject.Inject;

import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.RuleCall;
Expand All @@ -22,11 +20,12 @@
import com.zazuko.rdfmapping.dsl.rdfMapping.Mapping;
import com.zazuko.rdfmapping.dsl.rdfMapping.OmniMap;
import com.zazuko.rdfmapping.dsl.rdfMapping.PredicateObjectMapping;
import com.zazuko.rdfmapping.dsl.rdfMapping.ReferenceValuedTerm;
import com.zazuko.rdfmapping.dsl.rdfMapping.SourceGroup;
import com.zazuko.rdfmapping.dsl.rdfMapping.TemplateValuedTerm;
import com.zazuko.rdfmapping.dsl.rdfMapping.ValuedTerm;
import com.zazuko.rdfmapping.dsl.services.RdfMappingGrammarAccess;

import jakarta.inject.Inject;

public class RdfMappingIdeProposalProvider extends IdeContentProposalProvider {

@Inject
Expand Down Expand Up @@ -74,11 +73,8 @@ protected boolean filterKeyword(Keyword keyword, ContentAssistContext context) {
if (context.getCurrentModel() instanceof PredicateObjectMapping) {
return this.keywordFilter.filter((PredicateObjectMapping) context.getCurrentModel(), keyword, context);

} else if (context.getCurrentModel() instanceof ReferenceValuedTerm) {
return this.keywordFilter.filter((ReferenceValuedTerm) context.getCurrentModel(), keyword, context);

} else if (context.getCurrentModel() instanceof TemplateValuedTerm) {
return this.keywordFilter.filter((TemplateValuedTerm) context.getCurrentModel(), keyword, context);
} else if (context.getCurrentModel() instanceof ValuedTerm) {
return this.keywordFilter.filter((ValuedTerm) context.getCurrentModel(), keyword, context);

} else if (context.getCurrentModel() instanceof SourceGroup) {
return this.keywordFilter.filter((SourceGroup) context.getCurrentModel(), keyword, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import java.util.Collections;
import java.util.function.Predicate;

import jakarta.inject.Inject;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext;
Expand All @@ -15,10 +13,11 @@
import com.zazuko.rdfmapping.dsl.rdfMapping.Mapping;
import com.zazuko.rdfmapping.dsl.rdfMapping.OutputType;
import com.zazuko.rdfmapping.dsl.rdfMapping.PredicateObjectMapping;
import com.zazuko.rdfmapping.dsl.rdfMapping.ReferenceValuedTerm;
import com.zazuko.rdfmapping.dsl.rdfMapping.SourceGroup;
import com.zazuko.rdfmapping.dsl.rdfMapping.SourceType;
import com.zazuko.rdfmapping.dsl.rdfMapping.TemplateValuedTerm;
import com.zazuko.rdfmapping.dsl.rdfMapping.ValuedTerm;

import jakarta.inject.Inject;

public class KeywordFilter {

Expand All @@ -33,37 +32,34 @@ public boolean filter(PredicateObjectMapping in, Keyword keyword, ContentAssistC
return filter.test(keyword);
}

public boolean filter(ReferenceValuedTerm in, Keyword keyword, ContentAssistContext context) {
Predicate<Keyword> filter = this.referencedValueTermFilter(in);
return filter.test(keyword);
}

private Predicate<Keyword> referencedValueTermFilter(EObject in) {
OutputType type = modelAccess.outputType(in);
return new RmlishOutputTypeCompletionProposalPredicate("as", type);
}

public boolean filter(TemplateValuedTerm in, Keyword keyword, ContentAssistContext context) {
Predicate<Keyword> filter = this.referencedValueTermFilter(in);
public boolean filter(ValuedTerm in, Keyword keyword, ContentAssistContext context) {
Predicate<Keyword> filter = this.valuedTermFilter(in);

EObject container = in.eContainer();

// #30 for a subjectIriMapping, don't offer 'Literal'
if (container instanceof Mapping) {
Mapping mapping = (Mapping) container;
// make sure we really have subjetIriMapping in our hands
if (mapping.getSubjectIriMapping() == in) {

// make sure we really have subjetMapping in our hands
if (mapping.getSubjectMapping() == in) {

// #30 for a subjectMapping, don't offer 'Literal'
filter = filter.and(new BlacklistedCompletionProposalPredicate("Literal"));
}
}

if (container instanceof GraphMapping) {
// within a graphMapping, 'as' is not a viable option for a TemplateValuedTerm
// within a graphMapping, 'as' is not a viable option for a ValuedTerm
filter = filter.and(new BlacklistedCompletionProposalPredicate("as"));
}

return filter.test(keyword);
}

private Predicate<Keyword> valuedTermFilter(EObject in) {
OutputType type = modelAccess.outputType(in);
return new RmlishOutputTypeCompletionProposalPredicate("as", type);
}

public boolean filter(SourceGroup in, Keyword keyword, ContentAssistContext context) {
return this.completeKeywordForSourceDefinition(keyword,
Expand All @@ -76,8 +72,13 @@ public boolean filter(LogicalSource in, Keyword keyword, ContentAssistContext co
}

public boolean filter(Mapping in, Keyword keyword, ContentAssistContext context) {
OutputType type = this.modelAccess.outputType(in);
return new RmlishOutputTypeCompletionProposalPredicate("graphs", type).test(keyword);
OutputType outputType = this.modelAccess.outputType(in);

Predicate<Keyword> filter = new RmlishOutputTypeCompletionProposalPredicate("graphs", outputType);
filter = filter.and(new RmlishOutputTypeCompletionProposalPredicate("from", outputType));
filter = filter.and(new RmlishOutputTypeCompletionProposalPredicate("constant", outputType));

return filter.test(keyword);
}

private boolean completeKeywordForSourceDefinition(Keyword keyword, SourceType type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ class ValidationRuleTest {
}

@Test
def void rmp_parentMap_ok() {
def void rml_parentMap_ok() {
val result = parseHelper.parse(outputTypeSnippets.outputType_propertiesmapping("rml", '''employee.one parent-map EmployeeMapping2;'''));

validationTester.assertNoErrors(result);
Expand Down Expand Up @@ -339,6 +339,42 @@ class ValidationRuleTest {
);
}

@Test
def void rml_subjectFrom_ok() {
val result = parseHelper.parse(outputTypeSnippets.outputType_subjectMapping("rml", '''from id'''));

validationTester.assertNoErrors(result);
}

@Test
def void csv_subjectFrom_onRmlishOnly() {
val result = parseHelper.parse(outputTypeSnippets.outputType_subjectMapping("csvw", '''from id'''));

validationTester.assertWarning(result,
RdfMappingPackage.eINSTANCE.referenceValuedTerm,
RdfMappingValidationCodes.EOBJECT_SUPERFLUOUS,
"Not on output of type 'csvw' - only valid on [rml, r2rml, carml]"
);
}

@Test
def void rml_subjectConstant_ok() {
val result = parseHelper.parse(outputTypeSnippets.outputType_subjectMapping("rml", '''constant "http://airport.example.org/BIU"'''));

validationTester.assertNoErrors(result);
}

@Test
def void csv_subjectConstant_onRmlishOnly() {
val result = parseHelper.parse(outputTypeSnippets.outputType_subjectMapping("csvw", '''constant "http://airport.example.org/BIU"'''));

validationTester.assertWarning(result,
RdfMappingPackage.eINSTANCE.constantValuedTerm,
RdfMappingValidationCodes.EOBJECT_SUPERFLUOUS,
"Not on output of type 'csvw' - only valid on [rml, r2rml, carml]"
);
}

@Test
def void mapping_graphMap_templateWithTermType() {
val result = parseHelper.parse(mappingSnippets.graphMap_templateWithTermType());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,22 @@ class OutputTypeValidationDSLSnippets {
}
'''
def outputType_subjectMapping(String outputType, String subjectMapping) '''
output «outputType»

map EmployeeMapping1 from EMPLOYEE1 {
subject «subjectMapping»;
}

logical-source EMPLOYEE1 {
type csv
source "EMP"

referenceables
id
}
'''
def outputTypeWithoutMapping() '''
output csvw

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import com.zazuko.rdfmapping.dsl.rdfMapping.Prefix;
import com.zazuko.rdfmapping.dsl.rdfMapping.Referenceable;
import com.zazuko.rdfmapping.dsl.rdfMapping.TemplateDeclaration;
import com.zazuko.rdfmapping.dsl.rdfMapping.TemplateValuedTerm;
import com.zazuko.rdfmapping.dsl.rdfMapping.ValuedTerm;
import com.zazuko.rdfmapping.dsl.rdfMapping.Vocabulary;

/**
Expand All @@ -24,7 +24,7 @@
public class RdfMappingOutlineTreeProvider extends DefaultOutlineTreeProvider {

protected void _createChildren(DocumentRootNode parentNode, Mapping mapping) {
createNode(parentNode, mapping.getSubjectIriMapping());
createNode(parentNode, mapping.getSubjectMapping());
}

protected void _createChildren(DocumentRootNode parentNode, Vocabulary v) {
Expand All @@ -35,7 +35,7 @@ protected void _createNode(IOutlineNode parentNode, Prefix modelElement) {

}

protected void _createNode(IOutlineNode parentNode, TemplateValuedTerm modelElement) {
protected void _createNode(IOutlineNode parentNode, ValuedTerm modelElement) {

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ TemplateValueRef:

Mapping:
'map' name=ID 'from' source=[LogicalSource|QualifiedName] BLOCK_BEGIN
'subject' subjectIriMapping=TemplateValuedTerm LINE_END
'subject' subjectMapping=SubjectMapping LINE_END
('graphs' (graphMappings+=GraphMapping)+)?
('types' (subjectTypeMappings+=SubjectTypeMapping)+)?
('properties' (poMappings+=PredicateObjectMapping)+)?
Expand All @@ -158,8 +158,14 @@ SubjectTypeMapping:
type=[RdfClass|RdfPrefixedName]
;

SubjectMapping returns ValuedTerm:
TemplateValuedTerm
| ConstantValuedTerm
| SubjectReferenceValuedTerm
;

GraphMapping:
(template=TemplateValuedTerm | constant=ConstantValuedTerm) LINE_END
(template=TemplateValuedTerm | constant=ConstantValuedTerm | reference=GraphMappingReferenceValuedTerm) LINE_END
;

PredicateObjectMapping:
Expand All @@ -183,6 +189,15 @@ ReferenceValuedTerm:
('as' termTypeRef=TermTypeRef)?
;

SubjectReferenceValuedTerm returns ReferenceValuedTerm:
'from' reference=[Referenceable]
('as' termTypeRef=TermTypeRef)?
;

GraphMappingReferenceValuedTerm returns ReferenceValuedTerm:
'from' reference=[Referenceable]
;

MultiReferenceValuedTerm:
'multi-reference' 'from' reference=[Referenceable]
('with' 'datatype' datatype=[Datatype|RdfPrefixedName] | 'with' 'language-tag' languageTag=[LanguageTag])?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ class RealRdfMappingFormatter extends AbstractFormatter2 {
regionFor.ruleCall(ga.mappingAccess.BLOCK_BEGINTerminalRuleCall_4).append[setNewLines(1)];

regionFor.keyword(ga.mappingAccess.subjectKeyword_5).append[oneSpace];
subjectIriMapping?.format;
subjectMapping?.format;
regionFor.ruleCall(ga.mappingAccess.LINE_ENDTerminalRuleCall_7).prepend[noSpace];

// 'graphs'
Expand Down
Loading

0 comments on commit a225b62

Please sign in to comment.