Skip to content

Commit

Permalink
TEIID-5222 adding general array conversion support
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Jan 22, 2018
1 parent db6ca48 commit cd9edba
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.teiid.core.CorePlugin;
import org.teiid.core.types.ArrayImpl;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.DataTypeManager.DefaultDataClasses;
import org.teiid.core.types.Transform;
import org.teiid.core.types.TransformationException;

Expand Down Expand Up @@ -72,7 +73,6 @@ public Object transform(Object value, Class<?> targetType)
targetClass, value));
}
}
//TODO: allow casts from integer[] to string[], etc.
if (targetType.isArray()) {
if (value instanceof Array) {
try {
Expand All @@ -89,14 +89,33 @@ public Object transform(Object value, Class<?> targetType)
throw new TransformationException(e);
}
}
if (value.getClass().isArray()
&& value.getClass().getComponentType().isPrimitive()
&& targetType.getComponentType().isAssignableFrom(convertPrimitiveToObject(value.getClass().getComponentType()))) {
Object[] result = new Object[java.lang.reflect.Array.getLength(value)];
for (int i = 0; i < result.length; i++) {
result[i] = java.lang.reflect.Array.get(value, i);
}
return new ArrayImpl(result);
if (value.getClass().isArray()) {
if (value.getClass().getComponentType().isPrimitive()
&& targetType.getComponentType().isAssignableFrom(convertPrimitiveToObject(value.getClass().getComponentType()))) {
Object[] result = (Object[]) java.lang.reflect.Array.newInstance(targetType.getComponentType(), java.lang.reflect.Array.getLength(value));
for (int i = 0; i < result.length; i++) {
result[i] = java.lang.reflect.Array.get(value, i);
}
return new ArrayImpl(result);
}
Class<?> targetComponentType = targetType.getComponentType();
Object[] result = (Object[]) java.lang.reflect.Array.newInstance(targetComponentType, java.lang.reflect.Array.getLength(value));
for (int i = 0; i < result.length; i++) {
Object v = java.lang.reflect.Array.get(value, i);
if (v.getClass() == targetComponentType || DefaultDataClasses.OBJECT == targetComponentType) {
result[i] = v;
} else {
Transform subTransform = DataTypeManager.getTransform(v.getClass(), targetComponentType);
if (subTransform == null) {
valid = false;
break;
}
result[i] = subTransform.transform(v, targetComponentType);
}
}
if (valid) {
return new ArrayImpl(result);
}
}
}
valid = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,11 @@ public String toString() {
byte[] value = {1,2};
assertArrayEquals(value, (byte[])DataTypeManager.convertToRuntimeType(value, false));
assertEquals(new BinaryType(value), DataTypeManager.convertToRuntimeType(value, true));
}
}

@Test public void testObjectTypeArray() throws Exception {
Object value = new Object[] {"a", "b"};
DataTypeManager.transformValue(value, value.getClass(), String[].class);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import static org.junit.Assert.*;
import static org.teiid.query.processor.TestProcessor.*;
import static org.teiid.query.processor.TestProcessor.helpParse;
import static org.teiid.query.resolver.TestResolver.*;

import java.util.ArrayList;
Expand Down Expand Up @@ -67,15 +68,21 @@ public class TestArrayProcessing {

helpProcess(plan, dataManager, null);

//should fail
//should succeed
sql = "select cast(cast((1,2) as object) as string[])"; //$NON-NLS-1$

try {
helpGetPlan(helpParse(sql), RealMetadataFactory.exampleBQTCached(), DefaultCapabilitiesFinder.INSTANCE, createCommandContext());
fail();
} catch (TeiidProcessingException e) {

}
plan = helpGetPlan(helpParse(sql), RealMetadataFactory.exampleBQTCached(), DefaultCapabilitiesFinder.INSTANCE, createCommandContext());
helpProcess(plan, dataManager, null);

//should fail
sql = "select cast(cast((1,2) as object) as time[])"; //$NON-NLS-1$

try {
helpGetPlan(helpParse(sql), RealMetadataFactory.exampleBQTCached(), DefaultCapabilitiesFinder.INSTANCE, createCommandContext());
fail();
} catch (TeiidProcessingException e) {

}
}

@Test public void testArrayComparison() {
Expand Down

0 comments on commit cd9edba

Please sign in to comment.