Smalyshev has uploaded a new change for review. ( 
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/label/EmptyLabelServiceOptimizer.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
5 files changed, 70 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/rdf 
refs/changes/87/388287/1

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/label/EmptyLabelServiceOptimizer.java
 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/EmptyLabelServiceOptimizer.java
index 3e6a4e0..d7edf93 100644
--- 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/EmptyLabelServiceOptimizer.java
+++ 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/EmptyLabelServiceOptimizer.java
@@ -62,7 +62,9 @@
                 break;
             }
 
-            foundArg = 
EmptyLabelServiceOptimizer.this.restoreExtracted(service) || foundArg;
+            if (EmptyLabelServiceOptimizer.this.restoreExtracted(service)) {
+                foundArg = true;
+            }
 
             if (!foundArg) {
                 EmptyLabelServiceOptimizer.this.addResolutions(ctx, g, 
root.getProjection());
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: newchange
Gerrit-Change-Id: I0b2aa6353531f6017056b5917a22fea8ce737336
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/rdf
Gerrit-Branch: master
Gerrit-Owner: Smalyshev <smalys...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to