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$
}
Show replies by date