jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/388287 )
Change subject: Add option to fetch ordinal of the result in MWAPI query: ...................................................................... Add option to fetch ordinal of the result in MWAPI query: ?number wikibase:apiOrdinal true . Bug: T177275 Change-Id: I0b2aa6353531f6017056b5917a22fea8ce737336 --- M blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/BigdataValuesHelper.java M blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplate.java M blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/MWApiServiceCall.java M blazegraph/src/test/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplateUnitTest.java 4 files changed, 67 insertions(+), 4 deletions(-) Approvals: Smalyshev: Looks good to me, approved jenkins-bot: Verified Gehel: Looks good to me, but someone else must approve diff --git a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/BigdataValuesHelper.java b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/BigdataValuesHelper.java index 2a488f3..ea14466 100644 --- a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/BigdataValuesHelper.java +++ b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/BigdataValuesHelper.java @@ -11,8 +11,11 @@ import com.bigdata.rdf.internal.IV; import com.bigdata.rdf.internal.VTE; import com.bigdata.rdf.internal.impl.TermId; +import com.bigdata.rdf.internal.impl.literal.XSDNumericIV; import com.bigdata.rdf.model.BigdataValue; import com.bigdata.rdf.model.BigdataValueFactory; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * Helper class to create Bigdata values from constants. @@ -112,6 +115,28 @@ } /** + * Create constant from int. + * @param vf + * @param value + * @return + */ + @SuppressFBWarnings(value = "UP_UNUSED_PARAMETER", justification = "Don't need BigdataValueFactory, but leave it to have uniform API") + public static IConstant makeConstant(BigdataValueFactory vf, int value) { + return new Constant(new XSDNumericIV<>(value)); + } + + /** + * Create constant from double. + * @param vf + * @param value + * @return + */ + @SuppressFBWarnings(value = "UP_UNUSED_PARAMETER", justification = "Don't need BigdataValueFactory, but leave it to have uniform API") + public static IConstant makeConstant(BigdataValueFactory vf, double value) { + return new Constant(new XSDNumericIV<>(value)); + } + + /** * Create new variable with given name. * @param varName * @return diff --git a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplate.java b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplate.java index 0acfb8f..3401feb 100644 --- a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplate.java +++ b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplate.java @@ -242,6 +242,11 @@ for (OutputVariable.Type varType : OutputVariable.Type.values()) { if (varType.predicate.equals(sp.p().getValue())) { IVariable var = (IVariable)sp.s().getValueExpression(); + if (varType == varType.ORDINAL) { + // Ordinal values ignore the object + vars.add(new OutputVariable(varType, var, ".")); + break; + } IV value = sp.o().getValueExpression().get(); if (value.isURI()) { String paramName = value.stringValue().substring(prefix.length()); @@ -279,7 +284,11 @@ /** * Item ID. */ - ITEM("apiOutputItem"); + ITEM("apiOutputItem"), + /** + * Ordinal - i.e. place of the result in the list. + */ + ORDINAL("apiOrdinal"); /** * Predicate used for this type. @@ -360,11 +369,19 @@ } /** + * Is it the ordinal value? + * @return + */ + public boolean isOrdinal() { + return type == Type.ORDINAL; + } + + /** * Would this variable produce an URI? * @return */ public boolean isURI() { - return type != Type.STRING; + return type != Type.STRING && type != Type.ORDINAL; } /** diff --git a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/MWApiServiceCall.java b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/MWApiServiceCall.java index 8b3d77b..c1e0f16 100644 --- a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/MWApiServiceCall.java +++ b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/mwapi/MWApiServiceCall.java @@ -222,9 +222,14 @@ final Node node = nodes.item(i); results[i] = binding.copy(null); for (Map.Entry<OutputVariable, XPathExpression> var: compiledVars.entrySet()) { + final IConstant constant; + if (var.getKey().isOrdinal()) { + constant = makeConstant(lexiconRelation.getValueFactory(), i); + results[i].set(var.getKey().getVar(), constant); + continue; + } final Node value = (Node)var.getValue().evaluate(node, XPathConstants.NODE); if (value != null && value.getNodeValue() != null) { - final IConstant constant; if (var.getKey().isURI()) { constant = makeConstant(lexiconRelation.getValueFactory(), var.getKey().getURI(value.getNodeValue())); } else { diff --git a/blazegraph/src/test/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplateUnitTest.java b/blazegraph/src/test/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplateUnitTest.java index 8898ada..2a60485 100644 --- a/blazegraph/src/test/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplateUnitTest.java +++ b/blazegraph/src/test/java/org/wikidata/query/rdf/blazegraph/mwapi/ApiTemplateUnitTest.java @@ -130,20 +130,28 @@ createURI(ApiTemplate.OutputVariable.Type.ITEM.predicate()), createConstant("item/@wikibase_id") )); + // Variable with ordinal + patterns.addArg(new StatementPatternNode( + new VarNode("var4"), + createURI(ApiTemplate.OutputVariable.Type.ORDINAL.predicate()), + createConstant("goat") + )); ServiceNode serviceNode = new ServiceNode(createConstant("test"), patterns); List<OutputVariable> outputs = template.getOutputVars(serviceNode); - assertThat(outputs.size(), equalTo(3)); + assertThat(outputs.size(), equalTo(4)); // Pre-defined variable OutputVariable var = outputs.get(0); assertThat(var.getName(), equalTo("somevar")); assertThat(var.getPath(), equalTo("@title")); + assertFalse(var.isOrdinal()); // User-defined variable var = outputs.get(1); assertThat(var.getName(), equalTo("var2")); assertThat(var.getPath(), equalTo("@somedata")); assertTrue(var.isURI()); + assertFalse(var.isOrdinal()); assertThat(var.getURI("http://test.com/"), instanceOf(URI.class)); // URI keeps the case assertThat(var.getURI("http://test.com/test").toString(), endsWith("test")); @@ -152,9 +160,17 @@ assertThat(var.getName(), equalTo("var3")); assertThat(var.getPath(), equalTo("item/@wikibase_id")); assertTrue(var.isURI()); + assertFalse(var.isOrdinal()); assertThat(var.getURI("test"), instanceOf(URI.class)); // T172642: Item URIs will be uppercased assertThat(var.getURI("test").toString(), endsWith("TEST")); + // Ordinal + var = outputs.get(3); + assertThat(var.getName(), equalTo("var4")); + assertThat(var.getPath(), equalTo(".")); + assertFalse(var.isURI()); + assertTrue(var.isOrdinal()); + } @Test(expected = NullPointerException.class) -- To view, visit https://gerrit.wikimedia.org/r/388287 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I0b2aa6353531f6017056b5917a22fea8ce737336 Gerrit-PatchSet: 2 Gerrit-Project: wikidata/query/rdf Gerrit-Branch: master Gerrit-Owner: Smalyshev <smalys...@wikimedia.org> Gerrit-Reviewer: Gehel <guillaume.leder...@wikimedia.org> Gerrit-Reviewer: Smalyshev <smalys...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits