[Mulgara-svn] r1840 - branches/distinct_queries/src/jar/querylang/java/org/mulgara/sparql
pag at mulgara.org
pag at mulgara.org
Fri Nov 13 19:25:27 UTC 2009
Author: pag
Date: 2009-11-13 11:25:26 -0800 (Fri, 13 Nov 2009)
New Revision: 1840
Modified:
branches/distinct_queries/src/jar/querylang/java/org/mulgara/sparql/PatternMapper.java
Log:
Expanded queries on literal integers to handle all integral types
Modified: branches/distinct_queries/src/jar/querylang/java/org/mulgara/sparql/PatternMapper.java
===================================================================
--- branches/distinct_queries/src/jar/querylang/java/org/mulgara/sparql/PatternMapper.java 2009-11-13 19:19:50 UTC (rev 1839)
+++ branches/distinct_queries/src/jar/querylang/java/org/mulgara/sparql/PatternMapper.java 2009-11-13 19:25:26 UTC (rev 1840)
@@ -169,8 +169,7 @@
if (lit.isLanguageCoded()) return new LiteralImpl(lit.getValue(), lit.getLanguage());
return new LiteralImpl(lit.getValue());
}
- // integer, decimal, double, boolean
- if (n instanceof IntegerLiteral) return new LiteralImpl(((IntegerLiteral)n).getValue().toString(), XSD.INT_URI);
+ // decimal, double, boolean
if (n instanceof DecimalLiteral) return new LiteralImpl(((IntegerLiteral)n).getValue().toString(), XSD.DECIMAL_URI);
if (n instanceof DoubleLiteral) return new LiteralImpl(((IntegerLiteral)n).getValue().toString(), XSD.DOUBLE_URI);
if (n instanceof BooleanLiteral) return new LiteralImpl(((IntegerLiteral)n).getValue().toString(), XSD.BOOLEAN_URI);
@@ -183,13 +182,72 @@
* @param t The triple to convert.
* @return The new constraint.
*/
- private static ConstraintImpl newConstraintImpl(Triple t) {
+ private static ConstraintExpression newConstraintImpl(Triple t) {
ConstraintElement s = convertElement(t.getSubject());
ConstraintElement p = convertElement(t.getPredicate());
- ConstraintElement o = convertElement(t.getObject());
+ // if the object it a literal, then it may need to be expanded into various equivalent types
+ Node n = t.getObject();
+ if (n instanceof IntegerLiteral) {
+ ConstraintElement[] numbers = createIntLiterals((IntegerLiteral)n);
+ List<ConstraintExpression> options = new ArrayList<ConstraintExpression>();
+ for (ConstraintElement obj: numbers) {
+ options.add(new ConstraintImpl(s, p, obj));
+ }
+ return new ConstraintDisjunction(options);
+ }
+
+ ConstraintElement o = convertElement(n);
return new ConstraintImpl(s, p, o);
}
+ /**
+ * Create an array of the literals represented by a number.
+ * @param nrText The text of a number.
+ * @return All the literals that this number can represent.
+ */
+ private static ConstraintElement[] createIntLiterals(IntegerLiteral n) {
+ List<ConstraintElement> elts = new ArrayList<ConstraintElement>();
+ String nrText = n.getValue().toString();
+ long nr = n.getValue().longValue();
+
+ elts.add(new LiteralImpl(nrText, XSD.DECIMAL_URI));
+ elts.add(new LiteralImpl(nrText, XSD.INTEGER_URI));
+ elts.add(new LiteralImpl(nrText, XSD.LONG_URI));
+ if (nr <= Integer.MAX_VALUE && nr >= Integer.MIN_VALUE) {
+ elts.add(new LiteralImpl(nrText, XSD.INT_URI));
+ if (nr <= Short.MAX_VALUE && nr >= Short.MIN_VALUE) {
+ elts.add(new LiteralImpl(nrText, XSD.SHORT_URI));
+ if (nr <= Byte.MAX_VALUE && nr >= Byte.MIN_VALUE) {
+ elts.add(new LiteralImpl(nrText, XSD.BYTE_URI));
+ }
+ }
+ }
+ if (nr < 0) {
+ elts.add(new LiteralImpl(nrText, XSD.NON_POSITIVE_INTEGER_URI));
+ elts.add(new LiteralImpl(nrText, XSD.NEGATIVE_INTEGER_URI));
+ } else if (nr > 0) {
+ elts.add(new LiteralImpl(nrText, XSD.NON_NEGATIVE_INTEGER_URI));
+ elts.add(new LiteralImpl(nrText, XSD.POSITIVE_INTEGER_URI));
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_LONG_URI));
+ if (nr <= UInt.MAX_VALUE) {
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_INT_URI));
+ if (nr <= UShort.MAX_VALUE) {
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_SHORT_URI));
+ if (nr <= UByte.MAX_VALUE) {
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_BYTE_URI));
+ }
+ }
+ }
+ } else { // nr == 0
+ elts.add(new LiteralImpl(nrText, XSD.NON_POSITIVE_INTEGER_URI));
+ elts.add(new LiteralImpl(nrText, XSD.NON_NEGATIVE_INTEGER_URI));
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_INT_URI));
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_SHORT_URI));
+ elts.add(new LiteralImpl(nrText, XSD.UNSIGNED_BYTE_URI));
+ }
+ return elts.toArray(new ConstraintElement[elts.size()]);
+ }
+
/** A mapping of pattern types to constructors for the objects they map to. */
private static Map<Class<? extends GroupGraphPattern>,PatternToConstraintMapper<? extends GroupGraphPattern>> constructors = new HashMap<Class<? extends GroupGraphPattern>,PatternToConstraintMapper<? extends GroupGraphPattern>>();
@@ -315,4 +373,12 @@
}
}
+ /** Describes the range of unsigned ints */
+ private static class UInt { public static final long MAX_VALUE = 0xFFFFFFFFL; }
+
+ /** Describes the range of unsigned shorts */
+ private static class UShort { public static final long MAX_VALUE = 0xFFFFL; }
+
+ /** Describes the range of unsigned bytes */
+ private static class UByte { public static final long MAX_VALUE = 0xFFL; }
}
More information about the Mulgara-svn
mailing list