[teiid-commits] teiid SVN: r2310 - in trunk: engine/src/main/java/org/teiid/query/function/source and 10 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Jun 28 12:14:57 EDT 2010


Author: shawkins
Date: 2010-06-28 12:14:55 -0400 (Mon, 28 Jun 2010)
New Revision: 2310

Modified:
   trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
   trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
   trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
   trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java
   trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
   trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
   trunk/engine/src/main/resources/org/teiid/query/i18n.properties
   trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
   trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
   trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java
   trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java
   trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java
Log:
TEIID-108 ensuring consistent (and correct) xsd type conversion.

Modified: trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/function/FunctionDescriptor.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -252,28 +252,9 @@
         		values = newValues;
         	}
             Object result = method.invoke(null, values);
-            if (!ALLOW_NAN_INFINITY) {
-        		if (result instanceof Double) {
-	            	Double floatVal = (Double)result;
-	            	if (Double.isInfinite(floatVal) || Double.isNaN(floatVal)) {
-	            		throw new FunctionExecutionException(new ArithmeticException("Infinite or invalid result"), ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003, getName())); //$NON-NLS-1$
-	            	}
-	            } else if (result instanceof Float) {
-	            	Float floatVal = (Float)result;
-	            	if (Float.isInfinite(floatVal) || Float.isNaN(floatVal)) {
-	            		throw new FunctionExecutionException(new ArithmeticException("Infinite or invalid result"), ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003, getName())); //$NON-NLS-1$
-	            	}
-	            }
-        	}
-            result = DataTypeManager.convertToRuntimeType(result);
-            result = DataTypeManager.transformValue(result, getReturnType());
-            if (result instanceof String) {
-            	String s = (String)result;
-        		if (s.length() > DataTypeManager.MAX_STRING_LENGTH) {
-        			return s.substring(0, DataTypeManager.MAX_STRING_LENGTH);
-        		}
-            }
-            return result;
+            return importValue(result, getReturnType());
+        } catch(ArithmeticException e) {
+    		throw new FunctionExecutionException(e, ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003, getName()));
         } catch(InvocationTargetException e) {
             throw new FunctionExecutionException(e.getTargetException(), ErrorMessageKeys.FUNCTION_0003, QueryPlugin.Util.getString(ErrorMessageKeys.FUNCTION_0003, getName()));
         } catch(IllegalAccessException e) {
@@ -281,5 +262,31 @@
         } catch (TransformationException e) {
         	throw new FunctionExecutionException(e, e.getMessage());
 		}
+	}
+
+	public static Object importValue(Object result, Class<?> expectedType)
+			throws ArithmeticException, TransformationException {
+		if (!ALLOW_NAN_INFINITY) {
+			if (result instanceof Double) {
+		    	Double floatVal = (Double)result;
+		    	if (Double.isInfinite(floatVal) || Double.isNaN(floatVal)) {
+		    		throw new ArithmeticException("Infinite or invalid result");  //$NON-NLS-1$
+		    	}
+		    } else if (result instanceof Float) {
+		    	Float floatVal = (Float)result;
+		    	if (Float.isInfinite(floatVal) || Float.isNaN(floatVal)) {
+		    		throw new ArithmeticException("Infinite or invalid result");  //$NON-NLS-1$
+		    	}
+		    }
+		}
+		result = DataTypeManager.convertToRuntimeType(result);
+		result = DataTypeManager.transformValue(result, expectedType);
+		if (result instanceof String) {
+			String s = (String)result;
+			if (s.length() > DataTypeManager.MAX_STRING_LENGTH) {
+				return s.substring(0, DataTypeManager.MAX_STRING_LENGTH);
+			}
+		}
+		return result;
 	}    
 }

Modified: trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -30,10 +30,11 @@
 import java.nio.CharBuffer;
 import java.sql.Blob;
 import java.sql.Clob;
+import java.sql.Date;
 import java.sql.SQLException;
 import java.sql.SQLXML;
+import java.sql.Time;
 import java.sql.Timestamp;
-import java.util.Calendar;
 import java.util.Collections;
 import java.util.List;
 
@@ -56,26 +57,28 @@
 import javax.xml.transform.stream.StreamSource;
 import javax.xml.xpath.XPathExpressionException;
 
+import net.sf.saxon.expr.JPConverter;
 import net.sf.saxon.om.Item;
 import net.sf.saxon.om.Name11Checker;
 import net.sf.saxon.sxpath.XPathEvaluator;
 import net.sf.saxon.sxpath.XPathExpression;
 import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.value.AtomicValue;
+import net.sf.saxon.value.DateTimeValue;
+import net.sf.saxon.value.DateValue;
+import net.sf.saxon.value.DayTimeDurationValue;
+import net.sf.saxon.value.TimeValue;
 
-import org.teiid.api.exception.query.FunctionExecutionException;
 import org.teiid.core.TeiidComponentException;
 import org.teiid.core.TeiidProcessingException;
 import org.teiid.core.types.ClobImpl;
 import org.teiid.core.types.ClobType;
-import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.SQLXMLImpl;
-import org.teiid.core.types.TransformationException;
 import org.teiid.core.types.XMLTranslator;
 import org.teiid.core.types.XMLType;
 import org.teiid.core.types.XMLType.Type;
 import org.teiid.query.eval.Evaluator;
 import org.teiid.query.function.CharsetUtils;
-import org.teiid.query.function.FunctionMethods;
 import org.teiid.query.processor.xml.XMLUtil;
 import org.teiid.query.util.CommandContext;
 import org.teiid.translator.WSConnection.Util;
@@ -89,21 +92,7 @@
 public class XMLSystemFunctions {
 	
 	private static final String P_OUTPUT_VALIDATE_STRUCTURE = "com.ctc.wstx.outputValidateStructure"; //$NON-NLS-1$
-	//YEAR 0 in the server timezone. used to determine negative years
-    public static long YEAR_ZERO;
-    static String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; //$NON-NLS-1$
     
-    static String TIMESTAMP_MICROZEROS = "000000000"; //$NON-NLS-1$
-    
-    static {
-        Calendar cal = Calendar.getInstance();
-    
-        for (int i = 0; i <= Calendar.MILLISECOND; i++) {
-            cal.set(i, 0);
-        }
-        YEAR_ZERO = cal.getTimeInMillis();
-    }
-    
 	public static ClobType xslTransform(CommandContext context, Object xml, Object styleSheet) throws Exception {
     	Source styleSource = null; 
 		Source xmlSource = null;
@@ -219,7 +208,7 @@
 		if (attributes != null) {
 			for (Evaluator.NameValuePair<?> nameValuePair : attributes) {
 				if (nameValuePair.value != null) {
-					eventWriter.add(eventFactory.createAttribute(new QName(nameValuePair.name), getStringValue(nameValuePair.value)));
+					eventWriter.add(eventFactory.createAttribute(new QName(nameValuePair.name), convertToAtomicValue(nameValuePair.value).getStringValue()));
 				}
 			}
 		}
@@ -299,19 +288,22 @@
 		return result;
 	}
 	
-	static String getStringValue(Object object) throws TransformerException {
-		if (object instanceof Timestamp) {
-			try {
-				return timestampToDateTime((Timestamp)object);
-			} catch (FunctionExecutionException e) {
-				throw new TransformerException(e);
-			}
-		}
-		try {
-			return DataTypeManager.transformValue(object, DataTypeManager.DefaultDataClasses.STRING);
-		} catch (TransformationException e) {
-			throw new TransformerException(e);
-		}
+	public static AtomicValue convertToAtomicValue(Object value) throws TransformerException {
+		if (value instanceof java.util.Date) { //special handling for time types
+        	java.util.Date d = (java.util.Date)value;
+        	DateTimeValue tdv = DateTimeValue.fromJavaDate(d);
+        	if (value instanceof Date) {
+        		value = new DateValue(tdv.getYear(), tdv.getMonth(), tdv.getDay(), tdv.getTimezoneInMinutes());
+        	} else if (value instanceof Time) {
+        		value = new TimeValue(tdv.getHour(), tdv.getMinute(), tdv.getSecond(), tdv.getMicrosecond(), tdv.getTimezoneInMinutes());
+        	} else if (value instanceof Timestamp) {
+        		Timestamp ts = (Timestamp)value;
+        		value = tdv.add(DayTimeDurationValue.fromMicroseconds(ts.getNanos() / 1000));
+        	}
+        	return (AtomicValue)value;
+        }
+		JPConverter converter = JPConverter.allocate(value.getClass(), null);
+		return (AtomicValue)converter.convert(value, null);
 	}
 	
 	static void convertValue(Writer writer, XMLEventWriter eventWriter, XMLEventFactory eventFactory, Object object) throws IOException,
@@ -332,7 +324,7 @@
 				r = clob.getCharacterStream();
 				convertReader(writer, eventWriter, r, Type.TEXT);
 			} else {
-				String val = getStringValue(object);
+				String val = convertToAtomicValue(object).getStringValue();
 				eventWriter.add(eventFactory.createCharacters(val));
 			}
 		} catch (SQLException e) {
@@ -391,44 +383,6 @@
 		return new XMLType(new SQLXMLImpl("<!--" + comment + "-->")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
-	/**
-	 * Formats a timestamp to an xs:dateTime.  This uses DATETIME_FORMAT
-	 * with a trailing string for nanoseconds (without right zeros). 
-	 */
-	public static String timestampToDateTime(Timestamp time) throws FunctionExecutionException {
-	    String result = FunctionMethods.format(time, DATETIME_FORMAT);
-	    int nanos = time.getNanos();
-	    if (nanos == 0) {
-	        return result;
-	    }
-	    
-	    StringBuffer resultBuffer = new StringBuffer();
-	    boolean first = true;
-	    int i = 0;
-	    for (; i < 9 && nanos > 0; i++) {
-	        int digit = nanos%10;
-	        if (first) {
-	            if (digit > 0) {
-	                resultBuffer.insert(0, digit);
-	                first = false;
-	            }
-	        } else {
-	            resultBuffer.insert(0, digit);
-	        }
-	        nanos /= 10;
-	    }
-	    if (i < 9) {
-	        resultBuffer.insert(0, TIMESTAMP_MICROZEROS.substring(i));
-	    }
-	    resultBuffer.insert(0, "."); //$NON-NLS-1$
-	    resultBuffer.insert(0, result);
-	    if (time.getTime() < YEAR_ZERO) {
-	        resultBuffer.insert(0, "-"); //$NON-NLS-1$
-	    }
-	    return resultBuffer.toString();
-	    
-	}
-	
     public static Source convertToSource(Object value) throws TeiidProcessingException {
     	if (value == null) {
     		return null;

Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -24,13 +24,19 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import net.sf.saxon.om.Item;
 import net.sf.saxon.om.SequenceIterator;
 import net.sf.saxon.sxpath.XPathDynamicContext;
 import net.sf.saxon.sxpath.XPathExpression;
 import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.type.BuiltInAtomicType;
+import net.sf.saxon.type.ConversionResult;
+import net.sf.saxon.value.AtomicValue;
+import net.sf.saxon.value.StringValue;
 import net.sf.saxon.value.Value;
 
 import org.teiid.api.exception.query.ExpressionEvaluationException;
@@ -41,6 +47,7 @@
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.XMLType;
 import org.teiid.query.execution.QueryExecPlugin;
+import org.teiid.query.function.FunctionDescriptor;
 import org.teiid.query.sql.lang.XMLTable;
 import org.teiid.query.sql.lang.XMLTable.XMLColumn;
 
@@ -49,6 +56,16 @@
  */
 public class XMLTableNode extends SubqueryAwareRelationalNode {
 
+	private static Map<Class<?>, BuiltInAtomicType> typeMapping = new HashMap<Class<?>, BuiltInAtomicType>();
+	
+	static {
+		typeMapping.put(DataTypeManager.DefaultDataClasses.TIMESTAMP, BuiltInAtomicType.DATE_TIME);
+		typeMapping.put(DataTypeManager.DefaultDataClasses.TIME, BuiltInAtomicType.TIME);
+		typeMapping.put(DataTypeManager.DefaultDataClasses.DATE, BuiltInAtomicType.DATE);
+		typeMapping.put(DataTypeManager.DefaultDataClasses.FLOAT, BuiltInAtomicType.FLOAT);
+		typeMapping.put(DataTypeManager.DefaultDataClasses.DOUBLE, BuiltInAtomicType.DOUBLE);
+	}
+	
 	private XMLTable table;
 	private List<XMLColumn> projectedColumns;
 	
@@ -151,10 +168,20 @@
 					}
 					Object value = Value.convertToJava(colItem);
 					if (value instanceof Item) {
-						value = ((Item)value).getStringValue();
+						Item i = (Item)value;
+						BuiltInAtomicType bat = typeMapping.get(proColumn.getSymbol().getType());
+						if (bat != null) {
+							ConversionResult cr = StringValue.convertStringToBuiltInType(i.getStringValueCS(), bat, null);
+							value = cr.asAtomic();
+							value = Value.convertToJava((AtomicValue)value);
+							if (value instanceof Item) {
+								value = ((Item)value).getStringValue();
+							}
+						} else {
+							value = i.getStringValue();
+						}
 					}
-					value = DataTypeManager.convertToRuntimeType(value);
-					value = DataTypeManager.transformValue(value, proColumn.getSymbol().getType());
+					value = FunctionDescriptor.importValue(value, proColumn.getSymbol().getType());
 					tuple.add(value);
 				} catch (XPathException e) {
 					throw new TeiidProcessingException(e, QueryExecPlugin.Util.getString("XMLTableNode.path_error", proColumn.getName())); //$NON-NLS-1$

Modified: trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/processor/xml/XMLValueTranslator.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -27,6 +27,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.xml.transform.TransformerException;
+
+import net.sf.saxon.value.DateTimeValue;
+import net.sf.saxon.value.GYearMonthValue;
+
 import org.teiid.api.exception.query.FunctionExecutionException;
 import org.teiid.core.types.DataTypeManager;
 import org.teiid.core.types.TransformationException;
@@ -48,7 +53,6 @@
     
     private static String GMONTHDAY_FORMAT = "--MM-dd"; //$NON-NLS-1$
     private static String GYEAR_FORMAT = "0000"; //$NON-NLS-1$
-    private static String GYEARMONTH_FORMAT = "yyyy-MM"; //$NON-NLS-1$
     
     public static final String DATETIME    = "dateTime"; //$NON-NLS-1$
     public static final String DOUBLE      = "double"; //$NON-NLS-1$
@@ -118,7 +122,11 @@
             
             switch (type) {
                 case DATETIME_CODE:
-                    valueStr = XMLSystemFunctions.timestampToDateTime((Timestamp)value);
+				try {
+					valueStr = XMLSystemFunctions.convertToAtomicValue(value).getStringValue();
+				} catch (TransformerException e) {
+					throw new TransformationException(e, e.getMessage());
+				}
                     break;
                 case DOUBLE_CODE:
                     valueStr = doubleToDouble((Double)value);
@@ -139,7 +147,13 @@
                     valueStr = FunctionMethods.format((BigInteger)value, GYEAR_FORMAT);
                     break;
                 case GYEARMONTH_CODE:
-                    valueStr = timestampTogYearMonth(value);
+				DateTimeValue dtv;
+				try {
+					dtv = ((DateTimeValue)XMLSystemFunctions.convertToAtomicValue(value));
+				} catch (TransformerException e) {
+					throw new TransformationException(e, e.getMessage());
+				}
+                	valueStr = new GYearMonthValue(dtv.getYear(), dtv.getMonth(), dtv.getTimezoneInMinutes()).getStringValue();
                     break;
                 default:
                     valueStr = defaultTranslation(value);
@@ -156,22 +170,6 @@
         return valueStr;
     }
 
-    /** 
-     * @param value
-     * @return
-     * @throws FunctionExecutionException
-     * @since 4.3
-     */
-    private static String timestampTogYearMonth(Object value) throws FunctionExecutionException {
-        String valueStr;
-        Timestamp time = (Timestamp)value;
-        valueStr = FunctionMethods.format(time, GYEARMONTH_FORMAT);
-        if (time.getTime() < XMLSystemFunctions.YEAR_ZERO) {
-            valueStr = "-" + valueStr; //$NON-NLS-1$
-        }
-        return valueStr;
-    }
-    
     /**
      * Translate any non-null value to a string by using the Object toString() method.
      * This works in any case where the Java string representation of an object is the 

Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -1158,6 +1158,7 @@
 				continue;
 			}
 			validateQName(obj, dc.getAlias());
+			validateXMLContentTypes(dc.getExpression(), obj);
 		}
     }
 
@@ -1200,9 +1201,18 @@
     
     @Override
     public void visit(XMLElement obj) {
+    	for (Expression expression : obj.getContent()) {
+    		validateXMLContentTypes(expression, obj);
+    	}
     	validateQName(obj, obj.getName());
     }
     
+    public void validateXMLContentTypes(Expression expression, LanguageObject parent) {
+		if (expression.getType() == DataTypeManager.DefaultDataClasses.OBJECT || expression.getType() == DataTypeManager.DefaultDataClasses.BLOB) {
+			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xml_content_type", expression), parent); //$NON-NLS-1$
+		}
+    }
+    
     @Override
     public void visit(QueryString obj) {
     	validateDerivedColumnNames(obj, obj.getArgs());
@@ -1248,8 +1258,11 @@
     				hadError = true;
     			}
     			context = true;
-        	} else if (!names.add(dc.getAlias().toUpperCase())) {
-    			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.duplicate_passing", dc.getAlias()), obj); //$NON-NLS-1$
+        	} else { 
+        		validateXMLContentTypes(dc.getExpression(), obj);
+        		if (!names.add(dc.getAlias().toUpperCase())) {
+        			handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.duplicate_passing", dc.getAlias()), obj); //$NON-NLS-1$
+        		}
         	}
 		}
     	if (xqe.usesContextItem() && !context) {

Modified: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -358,13 +358,20 @@
     public SequenceIterator evaluateXQuery(Object context, Map<String, Object> parameterValues) throws TeiidProcessingException {
         DynamicQueryContext dynamicContext = new DynamicQueryContext(config);
         
-        for (Map.Entry<String, Object> entry : parameterValues.entrySet()) {
-            Object value = entry.getValue();
-            if(value instanceof SQLXML) {                    
-            	value = XMLSystemFunctions.convertToSource(value);
-            }
-            dynamicContext.setParameter(entry.getKey(), value);                
-		}
+        try {
+	        for (Map.Entry<String, Object> entry : parameterValues.entrySet()) {
+	            Object value = entry.getValue();
+	            if(value instanceof SQLXML) {                    
+	            	value = XMLSystemFunctions.convertToSource(value);
+	            } else if (value instanceof java.util.Date) {
+	            	java.util.Date d = (java.util.Date)value;
+	            	value = XMLSystemFunctions.convertToAtomicValue(value);
+	            }
+	            dynamicContext.setParameter(entry.getKey(), value);                
+	        }
+        } catch (TransformerException e) {
+        	throw new TeiidProcessingException(e);
+        }
         
         if (context != null) {
         	Source source = XMLSystemFunctions.convertToSource(context);

Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties	2010-06-28 16:14:55 UTC (rev 2310)
@@ -907,6 +907,7 @@
 ValidationVisitor.xml_namespaces_reserved=The namespaces xmlns and xml are reserved.
 ValidationVisitor.xml_namespaces_null_uri=The null uri, or empty string, is not allowed as the uri value.
 ValidationVisitor.xml_attributes_reserved=The namespace xmlns is reserved.
+ValidationVisitor.xml_content_type=The expression "{0}" is of OBJECT or BLOB type, which cannot be used as an XML content value.
 ValidationVisitor.xml_invalid_qname=The qname "{0}" is invalid.
 ValidationVisitor.context_item_type=XMLTABLE or XMLQUERY PASSING context item must be an XML value.
 ValidationVisitor.passing_requires_name=XMLTABLE or XMLQUERY PASSING clause can only contain at most 1 unnamed item.

Modified: trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/test/java/org/teiid/query/function/source/TestXMLSystemFunctions.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -25,7 +25,6 @@
 import static org.junit.Assert.*;
 
 import java.io.File;
-import java.sql.Timestamp;
 import java.util.TimeZone;
 
 import net.sf.saxon.trans.XPathException;
@@ -40,6 +39,7 @@
 import org.teiid.core.types.XMLType;
 import org.teiid.core.util.FileUtil;
 import org.teiid.core.util.UnitTestUtil;
+import org.teiid.query.unittest.TimestampUtil;
 
 @SuppressWarnings("nls")
 public class TestXMLSystemFunctions {
@@ -197,10 +197,18 @@
         helpTestXpathValue(xmlFilePath,xpath, "false"); //$NON-NLS-1$
     }
     
-	@Test public void testInvokeXmlElement2() throws Exception {
-		assertEquals("1969-12-31T18:00:00", XMLSystemFunctions.getStringValue(new Timestamp(0)));
+	@Test public void testAtomicValueTimestamp() throws Exception {
+		assertEquals("1910-04-01T07:01:02.000055Z", XMLSystemFunctions.convertToAtomicValue(TimestampUtil.createTimestamp(10, 3, 1, 1, 1, 2, 55001)).getStringValue());
     }
 	
+	@Test public void testAtomicValueTime() throws Exception {
+		assertEquals("16:03:01Z", XMLSystemFunctions.convertToAtomicValue(TimestampUtil.createTime(10, 3, 1)).getStringValue());
+    }
+
+	@Test public void testAtomicValueDate() throws Exception {
+		assertEquals("1920-03-03Z", XMLSystemFunctions.convertToAtomicValue(TimestampUtil.createDate(20, 2, 3)).getStringValue());
+    }
+	
 	@Test public void testNameEscaping() throws Exception {
 		assertEquals("_u003A_b", XMLSystemFunctions.escapeName(":b", true));
     }

Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -25,6 +25,7 @@
 import static org.teiid.query.processor.TestProcessor.*;
 
 import java.io.FileInputStream;
+import java.sql.Timestamp;
 import java.util.Arrays;
 import java.util.List;
 
@@ -38,6 +39,7 @@
 import org.teiid.core.util.UnitTestUtil;
 import org.teiid.query.optimizer.capabilities.DefaultCapabilitiesFinder;
 import org.teiid.query.unittest.FakeMetadataFactory;
+import org.teiid.query.unittest.TimestampUtil;
 
 @SuppressWarnings({"nls", "unchecked"})
 public class TestSQLXMLProcessing {
@@ -343,6 +345,16 @@
     
         processPreparedStatement(sql, expected, dataManager, new DefaultCapabilitiesFinder(), FakeMetadataFactory.example1Cached(), Arrays.asList(blobFromFile("udf.xmi")));
     }
+	
+    @Test public void testXmlTableTypes() throws Exception {
+        String sql = "select * from xmltable('/a' passing xmlparse(document '<a>2000-01-01T01:01:00.2-06:00</a>') columns x timestamp path 'xs:dateTime(./text())', y timestamp path '.') as x"; //$NON-NLS-1$
+        Timestamp ts = TimestampUtil.createTimestamp(100, 0, 1, 1, 1, 0, 200000000);
+        List<?>[] expected = new List<?>[] {
+        		Arrays.asList(ts, ts),
+        };    
+    
+        process(sql, expected);
+    }
 
     private static FakeDataManager dataManager = new FakeDataManager();
     

Modified: trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/engine/src/test/java/org/teiid/query/processor/xml/TestXMLValueTranslator.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -22,52 +22,60 @@
 
 package org.teiid.query.processor.xml;
 
+import static org.junit.Assert.*;
+
 import java.math.BigInteger;
 import java.sql.Timestamp;
+import java.util.TimeZone;
 
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
 import org.teiid.core.types.DataTypeManager;
-import org.teiid.query.processor.xml.XMLValueTranslator;
+import org.teiid.core.util.TimestampWithTimezone;
 import org.teiid.query.unittest.TimestampUtil;
 
-import junit.framework.TestCase;
 
+public class TestXMLValueTranslator {
 
-public class TestXMLValueTranslator extends TestCase {
-
-    public TestXMLValueTranslator(String name) {
-        super(name);
-    }
+	@BeforeClass public static void setUp() { 
+		TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone("GMT-06:00")); //$NON-NLS-1$ 
+	}
+	
+	@AfterClass public static void tearDown() { 
+		TimestampWithTimezone.resetCalendar(null);
+	}
     
-    public void test24HourDateTimeTranslation() throws Exception {
-        Timestamp ts = TimestampUtil.createTimestamp(100, 0, 2, 14, 14, 5, 6);
+    @Test public void test24HourDateTimeTranslation() throws Exception {
+        Timestamp ts = TimestampUtil.createTimestamp(100, 0, 2, 14, 14, 5, 6000);
         
         String value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
-        assertEquals("2000-01-02T14:14:05.000000006", value); //$NON-NLS-1$
+        assertEquals("2000-01-02T20:14:05.000006Z", value); //$NON-NLS-1$
     }
     
-    public void testDateTimeTranslation() throws Exception {
+    @Test public void testDateTimeTranslation() throws Exception {
         Timestamp ts = TimestampUtil.createTimestamp(100, 0, 2, 3, 4, 5, 6);
         
         String value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
-        assertEquals("2000-01-02T03:04:05.000000006", value); //$NON-NLS-1$
+        assertEquals("2000-01-02T09:04:05Z", value); //$NON-NLS-1$
         
         ts.setNanos(6000);
         
         value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
-        assertEquals("2000-01-02T03:04:05.000006", value); //$NON-NLS-1$
+        assertEquals("2000-01-02T09:04:05.000006Z", value); //$NON-NLS-1$
         
         ts.setNanos(0);
 
         value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
-        assertEquals("2000-01-02T03:04:05", value); //$NON-NLS-1$
+        assertEquals("2000-01-02T09:04:05Z", value); //$NON-NLS-1$
         
         ts = TimestampUtil.createTimestamp(-2000, 0, 2, 3, 4, 5, 6);
 
         value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.DATETIME);
-        assertEquals("-0101-01-02T03:04:05.000000006", value); //$NON-NLS-1$
+        assertEquals("-0102-12-30T09:04:05Z", value); //$NON-NLS-1$
     }
     
-    public void testgYearTranslation() throws Exception {
+    @Test public void testgYearTranslation() throws Exception {
         String value = XMLValueTranslator.translateToXMLValue(new BigInteger("5"), DataTypeManager.DefaultDataClasses.BIG_INTEGER, XMLValueTranslator.GYEAR); //$NON-NLS-1$
         assertEquals("0005", value); //$NON-NLS-1$
 
@@ -75,19 +83,19 @@
         assertEquals("-10000", value); //$NON-NLS-1$
     }
     
-    public void testgYearMonthTranslation() throws Exception {
+    @Test public void testgYearMonthTranslation() throws Exception {
         Timestamp ts = TimestampUtil.createTimestamp(100, 0, 4, 6, 8, 10, 12);
         
         String value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.GYEARMONTH); 
-        assertEquals("2000-01", value); //$NON-NLS-1$
+        assertEquals("2000-01Z", value); //$NON-NLS-1$
         
         ts = TimestampUtil.createTimestamp(-30000, 0, 4, 6, 8, 10, 12);
         
         value = XMLValueTranslator.translateToXMLValue(ts, DataTypeManager.DefaultDataClasses.TIMESTAMP, XMLValueTranslator.GYEARMONTH); 
-        assertEquals("-28101-01", value); //$NON-NLS-1$
+        assertEquals("-28102-06Z", value); //$NON-NLS-1$
     }
     
-    public void testDefaultTranslation() throws Exception {
+    @Test public void testDefaultTranslation() throws Exception {
         String value = XMLValueTranslator.translateToXMLValue("", DataTypeManager.DefaultDataClasses.STRING, XMLValueTranslator.STRING); //$NON-NLS-1$
         assertNull(value); 
     }

Modified: trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/runtime/src/main/java/org/teiid/transport/ObjectEncoder.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -36,7 +36,6 @@
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.ChannelPipelineCoverage;
 import org.jboss.netty.channel.Channels;
-import org.jboss.netty.channel.DownstreamMessageEvent;
 import org.jboss.netty.channel.MessageEvent;
 import org.jboss.netty.handler.stream.ChunkedInput;
 import org.jboss.netty.handler.stream.ChunkedStream;

Modified: trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java	2010-06-28 14:47:10 UTC (rev 2309)
+++ trunk/test-integration/common/src/test/java/org/teiid/dqp/internal/process/TestXMLTypeTranslations.java	2010-06-28 16:14:55 UTC (rev 2310)
@@ -24,6 +24,7 @@
 
 import java.io.FileInputStream;
 import java.math.BigInteger;
+import java.sql.Timestamp;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -40,7 +41,6 @@
 import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
 import org.teiid.query.optimizer.capabilities.SourceCapabilities.Capability;
 import org.teiid.query.processor.HardcodedDataManager;
-import org.teiid.query.unittest.TimestampUtil;
 import org.teiid.translator.SourceSystemFunctions;
 
 
@@ -71,22 +71,25 @@
         models.add("sample"); //$NON-NLS-1$
         dataMgr.setValidModels(models);
         
+        Timestamp ts = new Timestamp(-2106305630000l);
+        ts.setNanos(3000000);
+        
         dataMgr.addData("SELECT g_0.\"timestamp\", g_0.\"double\", g_0.\"float\", convert(g_0.\"double\", biginteger), convert(g_0.\"double\", biginteger), convert(g_0.\"date\", timestamp), convert(g_0.\"double\", biginteger), convert(g_0.\"date\", timestamp), '1' FROM sample.RUNTIMEVALUE AS g_0", //$NON-NLS-1$ 
                         
                         new List[] { Arrays.asList(new Object[] { 
-                            TimestampUtil.createTimestamp(3, 3, 4, 5, 6, 10, 200), 
+                            ts, 
                             new Double(Double.NEGATIVE_INFINITY), 
                             new Float(Float.POSITIVE_INFINITY), 
                             new BigInteger("100"), //$NON-NLS-1$
                             new BigInteger("100"), //$NON-NLS-1$
-                            TimestampUtil.createTimestamp(3, 3, 4, 5, 6, 7, 0), 
+                            ts, 
                             new BigInteger("100"), //$NON-NLS-1$
-                            TimestampUtil.createTimestamp(3, 3, 4, 5, 6, 7, 0),
+                            ts,
                             "1" //$NON-NLS-1$
                                                    })});
         
         
-        List[] expected = new List[] { Arrays.asList(new Object[] {"<?xml version=\"1.0\" encoding=\"UTF-8\"?><XSDTypesNS:test xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:XSDTypesNS=\"http://www.metamatrix.com/XMLSchema/DataSets/XSDTypes\"><book><datetime>1903-04-04T05:06:10.0000002</datetime><double>-INF</double><float>INF</float><gday>---100</gday><gmonth>--100</gmonth><gmonthday>--04-04</gmonthday><gyear>0100</gyear><gyearmonth>1903-04</gyearmonth><string>1</string></book></XSDTypesNS:test>" })};                     //$NON-NLS-1$
+        List[] expected = new List[] { Arrays.asList(new Object[] {"<?xml version=\"1.0\" encoding=\"UTF-8\"?><XSDTypesNS:test xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:XSDTypesNS=\"http://www.metamatrix.com/XMLSchema/DataSets/XSDTypes\"><book><datetime>1903-04-04T11:06:10.006Z</datetime><double>-INF</double><float>INF</float><gday>---100</gday><gmonth>--100</gmonth><gmonthday>--04-04</gmonthday><gyear>0100</gyear><gyearmonth>1903-04Z</gyearmonth><string>1</string></book></XSDTypesNS:test>" })};                     //$NON-NLS-1$
         doProcess(metadata,  
                 sql, 
                 finder, dataMgr , expected, DEBUG);
@@ -117,5 +120,4 @@
         
     }
     
-
 }



More information about the teiid-commits mailing list