You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2013/11/06 16:32:11 UTC

svn commit: r1539365 - /stanbol/branches/release-0.12/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java

Author: rwesten
Date: Wed Nov  6 15:32:10 2013
New Revision: 1539365

URL: http://svn.apache.org/r1539365
Log:
merged fix for STANBOL-1205 to the 0.12.0 releaseing branch

Modified:
    stanbol/branches/release-0.12/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java

Modified: stanbol/branches/release-0.12/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java?rev=1539365&r1=1539364&r2=1539365&view=diff
==============================================================================
--- stanbol/branches/release-0.12/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java (original)
+++ stanbol/branches/release-0.12/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java Wed Nov  6 15:32:10 2013
@@ -18,18 +18,22 @@ package org.apache.stanbol.entityhub.que
 
 import static org.apache.stanbol.entityhub.servicesapi.defaults.SpecialFieldEnum.isSpecialField;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.stanbol.entityhub.core.utils.TimeUtils;
 import org.apache.stanbol.entityhub.servicesapi.defaults.DataTypeEnum;
+import org.apache.stanbol.entityhub.servicesapi.defaults.NamespaceEnum;
 import org.apache.stanbol.entityhub.servicesapi.model.Reference;
 import org.apache.stanbol.entityhub.servicesapi.model.rdf.RdfResourceEnum;
 import org.apache.stanbol.entityhub.servicesapi.query.Constraint;
@@ -557,12 +561,15 @@ public final class SparqlQueryUtils {
                                            String intend) {
         String rootVarName = selectedFields.get(null);
         Collection<String> dataTypes = constraint.getDataTypes();
-        if (dataTypes == null) {
-            // we need not to distinguish between empty and null
-            // because SPARQL includes support for automatic detection of
-            // dataTypes
-            // see http://www.w3.org/TR/rdf-sparql-query/#QSynLiterals
-            dataTypes = Collections.emptySet();
+        if(dataTypes == null || dataTypes.isEmpty()){
+            //guess dataTypes
+            dataTypes = new HashSet<String>();
+            for(Object value : constraint.getValues()){
+                String xsdType = guessXsdType(value.getClass());
+                if(xsdType != null){
+                    dataTypes.add(xsdType);
+                }
+            }
         }
         if (constraint.getValues() != null) {
             if (dataTypes.size() <= 1) {
@@ -999,15 +1006,26 @@ public final class SparqlQueryUtils {
                                       boolean lowerBound,
                                       boolean inclusive,
                                       Object value) {
-        String stringValue;
+        // adds (?var >/<[=] "valueString"^^xsd:type)
+        queryString.append("(?").append(var).append(' ');
+        queryString.append(lowerBound ? '>' : '<');
+        if(inclusive){
+            queryString.append('=');
+        }
+        queryString.append(" \"");
+        //append the string representation of the parsed value
         if (value instanceof Date) {// for dates add the data type!
-            stringValue = String.format("%s^^<%s>", TimeUtils.toString(DataTypeEnum.DateTime, (Date)value), XSD_DATE_TIME);
+            queryString.append(TimeUtils.toString(DataTypeEnum.DateTime, (Date)value));
         } else { // add additional "if" for special types if necessary
-            stringValue = value.toString();
+            queryString.append(value.toString());
+        }
+        queryString.append('"');
+        //append the xsd:dataType
+        String xsdType = guessXsdType(value.getClass());
+        if(xsdType != null){
+            queryString.append("^^").append('<').append(xsdType).append('>');
         }
-        // adds (?var >/<[=] valueString)
-        queryString.append(String.format("(?%s %c%s %s)", var, lowerBound ? '>' : '<', inclusive ? "=" : "",
-            stringValue));
+        queryString.append(')');
     }
 
     /**
@@ -1109,6 +1127,44 @@ public final class SparqlQueryUtils {
             queryString.append(")");
         }
     }
+    /**
+     * Return the appropriate XSD type for RDF literals based on the parsed Java class.
+     * This is used for encoding {@link ValueConstraint} and {@link RangeConstraint}s.
+     * Based on <code>org.apache.marmotta.commons.sesame.model.LiteralCommons(Class<?> javaClass)</code>
+     * @param javaClass
+     * @return
+     */
+    public static String guessXsdType(Class<?> javaClass) {
+        // if a string is parsed the query expects a plain literal. For xsd:String
+        // users need to explicitly parse the data type
+//        if(String.class.isAssignableFrom(javaClass)) {
+//            return NamespaceEnum.xsd + "string";
+//        } else 
+        if(Integer.class.isAssignableFrom(javaClass) || int.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd + "int";
+        } else if(BigInteger.class.isAssignableFrom(javaClass)){
+            return NamespaceEnum.xsd + "integer";
+        } else if(Long.class.isAssignableFrom(javaClass) || long.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd + "long";
+        } else if(Double.class.isAssignableFrom(javaClass) || double.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd +"double";
+        } else if(Float.class.isAssignableFrom(javaClass) || float.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd + "float";
+        } else if(BigDecimal.class.isAssignableFrom(javaClass)){
+            return NamespaceEnum.xsd + "decimal";
+        } else if(Date.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd + "dateTime";
+        } else if(Boolean.class.isAssignableFrom(javaClass) || boolean.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd + "boolean";
+        } else if(Short.class.isAssignableFrom(javaClass) || short.class.isAssignableFrom(javaClass)){
+            return NamespaceEnum.xsd + "short";
+        } else if(Byte.class.isAssignableFrom(javaClass) || byte.class.isAssignableFrom(javaClass)) {
+            return NamespaceEnum.xsd + "byte";
+        } else {
+            return null; //Namespaces.NS_XSD+"string";
+        }
+    }
+    
 
     public static void main(String[] args) {
         SparqlFieldQuery query = SparqlFieldQueryFactory.getInstance().createFieldQuery();