[teiid-commits] teiid SVN: r3565 - in trunk: engine/src/main/java/org/teiid/common/buffer/impl and 2 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Tue Oct 18 12:56:57 EDT 2011


Author: shawkins
Date: 2011-10-18 12:56:57 -0400 (Tue, 18 Oct 2011)
New Revision: 3565

Modified:
   trunk/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java
   trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java
   trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java
   trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java
Log:
TEIID-1788 improving typing and size logic

Modified: trunk/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java	2011-10-18 16:56:26 UTC (rev 3564)
+++ trunk/common-core/src/main/java/org/teiid/core/types/DataTypeManager.java	2011-10-18 16:56:57 UTC (rev 3565)
@@ -340,14 +340,20 @@
 	 * this is simply the class of the object. Some special cases are when the
 	 * value is of type Object or Null.
 	 */
-	public static Class determineDataTypeClass(Object value) {
+	public static Class<?> determineDataTypeClass(Object value) {
 		// Handle null case
 		if (value == null) {
 			return DefaultDataClasses.NULL;
 		}
-
-		return getDataTypeClass(getDataTypeName(convertToRuntimeType(value)
-				.getClass()));
+		Class<?> clazz = value.getClass();
+		if (DATA_TYPE_CLASSES.contains(clazz)) {
+			return clazz;
+		}
+		clazz = convertToRuntimeType(value).getClass();
+		if (DATA_TYPE_CLASSES.contains(clazz)) {
+			return clazz;
+		}
+		return DefaultDataClasses.OBJECT;
 	}
 
 	/**
@@ -748,7 +754,7 @@
 			return null;
 		}
 		Class<?> c = value.getClass();
-		if (getAllDataTypeClasses().contains(c)) {
+		if (DATA_TYPE_CLASSES.contains(c)) {
 			return value;
 		}
 		SourceTransform t = sourceConverters.get(c);

Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java	2011-10-18 16:56:26 UTC (rev 3564)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java	2011-10-18 16:56:57 UTC (rev 3565)
@@ -90,15 +90,14 @@
         size += (rowLength * (48 + alignMemory(colLength * REFERENCE_SIZE))); 
         for (int col = 0; col < colLength; col++) {
             Class<?> type = types[col];
+            int rowsSampled = 0;
+            int estimatedSize = 0;
 			if (VARIABLE_SIZE_TYPES.contains(type)) {
-            	int estRow = 0;
-                for (int row = 0; row < rowLength; row++) {
-                	boolean updateEst = row == estRow;
-                    size += getSize(data.get(row).get(col), updateEst, accountForValueCache);
-                    if (updateEst) {
-                    	estRow = estRow * 2 + 1;
-                    }
+                for (int row = 0; row < rowLength; row=(row*2)+1) {
+                	rowsSampled++;
+                    estimatedSize += getSize(data.get(row).get(col), types[col], true, accountForValueCache);
                 }
+                size += estimatedSize/(float)rowsSampled * rowLength;
             } else {
             	size += getSize(accountForValueCache, type) * rowLength;
             }
@@ -120,25 +119,17 @@
      * Get size of object
      * @return Size in bytes
      */
-    protected long getSize(Object obj, boolean updateEstimate, boolean accountForValueCache) {
+    protected long getSize(Object obj, Class<?> type, boolean updateEstimate, boolean accountForValueCache) {
         if(obj == null) {
             return 0;
         }
 
-        Class<?> type = DataTypeManager.determineDataTypeClass(obj);
         if(type == DataTypeManager.DefaultDataClasses.STRING) {
             int length = ((String)obj).length();
             if (length > 0) {
                 return alignMemory(40 + (2 * length));
             }
             return 40;
-        } else if(obj instanceof Iterable<?>) {
-        	Iterable<?> i = (Iterable<?>)obj;
-        	long total = 16;
-        	for (Object object : i) {
-				total += getSize(object, true, false) + REFERENCE_SIZE;
-			}
-        	return total;
         } else if(type == DataTypeManager.DefaultDataClasses.BIG_DECIMAL) {
         	if (!updateEstimate) {
         		return bigDecimalEstimate;
@@ -160,13 +151,20 @@
             	bigIntegerEstimate = (bigIntegerEstimate + result)/2;
             }
             return result;
+        } else if(obj instanceof Iterable<?>) {
+        	Iterable<?> i = (Iterable<?>)obj;
+        	long total = 16;
+        	for (Object object : i) {
+				total += getSize(object, DataTypeManager.determineDataTypeClass(object), true, false) + REFERENCE_SIZE;
+			}
+        	return total;
         } else if(obj.getClass().isArray()) {
         	Class<?> componentType = obj.getClass().getComponentType(); 
         	if (!componentType.isPrimitive()) {
 	            Object[] rows = (Object[]) obj;
 	            long total = 16 + alignMemory(rows.length * REFERENCE_SIZE); // Array overhead
 	            for(int i=0; i<rows.length; i++) {
-	                total += getSize(rows[i], true, false);
+	                total += getSize(rows[i], DataTypeManager.determineDataTypeClass(rows[i]), true, false);
 	            }
 	            return total;
         	}

Modified: trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java	2011-10-18 16:56:26 UTC (rev 3564)
+++ trunk/engine/src/main/java/org/teiid/query/sql/symbol/Constant.java	2011-10-18 16:56:57 UTC (rev 3565)
@@ -75,7 +75,13 @@
 	 */
 	public Constant(Object value) {
 		this.value = DataTypeManager.convertToRuntimeType(value);
-		this.type = DataTypeManager.determineDataTypeClass(this.value);
+		if (this.value == null) {
+			this.type = DataTypeManager.DefaultDataClasses.NULL;
+		} else if (DataTypeManager.getAllDataTypeClasses().contains(this.value.getClass())) {
+			this.type = this.value.getClass();
+		} else {
+			this.type = DataTypeManager.DefaultDataClasses.OBJECT; 
+		}
 	}
 
 	/**

Modified: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java	2011-10-18 16:56:26 UTC (rev 3564)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java	2011-10-18 16:56:57 UTC (rev 3565)
@@ -43,7 +43,7 @@
     }
 
     public void helpTestGetSize(Object obj, long expectedSize) {  
-        long actualSize = new SizeUtility(null).getSize(obj, true, false);
+        long actualSize = new SizeUtility(null).getSize(obj, DataTypeManager.determineDataTypeClass(obj), true, false);
         assertEquals("Got unexpected size: ", expectedSize, actualSize); //$NON-NLS-1$
     }
 



More information about the teiid-commits mailing list