Author: rwesten
Date: Wed Nov  6 15:28:54 2013
New Revision: 1539364

URL: http://svn.apache.org/r1539364
Log:
fix for STANBOL-1205

Modified:
    
stanbol/trunk/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java

Modified: 
stanbol/trunk/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java
URL: 
http://svn.apache.org/viewvc/stanbol/trunk/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java?rev=1539364&r1=1539363&r2=1539364&view=diff
==============================================================================
--- 
stanbol/trunk/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java
 (original)
+++ 
stanbol/trunk/entityhub/query/sparql/src/main/java/org/apache/stanbol/entityhub/query/sparql/SparqlQueryUtils.java
 Wed Nov  6 15:28:54 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();


Reply via email to