Skip to content

Commit

Permalink
TEIID-4751 allowing array iteration
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Feb 9, 2017
1 parent 35d1432 commit 287163c
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 3 deletions.
Expand Up @@ -23,12 +23,15 @@
package org.teiid.query.processor.relational;

import java.io.IOException;
import java.sql.Array;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;

import javax.script.CompiledScript;
import javax.script.ScriptContext;
Expand Down Expand Up @@ -56,6 +59,31 @@
* Handles object table processing.
*/
public class ObjectTableNode extends SubqueryAwareRelationalNode {

private static class ReflectiveArrayIterator implements Iterator<Object> {
private int index;
private Object array;
private int length;

ReflectiveArrayIterator(Object array) {
this.array = array;
length = java.lang.reflect.Array.getLength(this.array);
}

@Override
public boolean hasNext() {
return index < length;
}

@Override
public Object next() {
if (index >= length) {
throw new NoSuchElementException();
}
return java.lang.reflect.Array.get(array, index++);
}

}

private static final String TEIID_ROW_NUMBER = "teiid_row_number"; //$NON-NLS-1$
private static final String TEIID_ROW = "teiid_row"; //$NON-NLS-1$
Expand Down Expand Up @@ -171,6 +199,14 @@ private void evaluate() throws TeiidComponentException,
result = ((Iterable<?>)value).iterator();
} else if (value instanceof Iterator<?>) {
result = (Iterator<?>)value;
} else if (value != null && value.getClass().isArray()){
result = new ReflectiveArrayIterator(value);
} else if (value instanceof Array) {
try {
result = new ReflectiveArrayIterator(((Array)value).getArray());
} catch (SQLException e) {
throw new TeiidProcessingException(e);
}
} else {
result = Arrays.asList(value).iterator();
}
Expand Down
Expand Up @@ -31,6 +31,7 @@
import java.util.Properties;

import org.junit.Test;
import org.teiid.core.types.ArrayImpl;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.parser.QueryParser;
import org.teiid.query.sql.lang.Command;
Expand Down Expand Up @@ -72,10 +73,14 @@ public class TestObjectTable {

process(sql, expected);
}

public static void process(String sql, List<?>[] expectedResults) throws Exception {

public static void process(String sql, List<?>[] expectedResults) throws Exception {
process(sql, expectedResults, new List[] {Collections.singletonList(Arrays.asList("hello", "world")), Collections.singletonList(Arrays.asList("x", null, "y")), Collections.singletonList(null)});
}

public static void process(String sql, List<?>[] expectedResults, List<?>[] rows) throws Exception {
HardcodedDataManager dataManager = new HardcodedDataManager();
dataManager.addData("SELECT BQT1.SmallA.ObjectValue FROM BQT1.SmallA", new List[] {Collections.singletonList(Arrays.asList("hello", "world")), Collections.singletonList(Arrays.asList("x", null, "y")), Collections.singletonList(null)} );
dataManager.addData("SELECT BQT1.SmallA.ObjectValue FROM BQT1.SmallA", rows);
Properties p = new Properties();
p.put(TransformationMetadata.ALLOWED_LANGUAGES, ObjectTable.DEFAULT_LANGUAGE);
TransformationMetadata metadata = RealMetadataFactory.createTransformationMetadata(RealMetadataFactory.exampleBQTCached().getMetadataStore(), "bqt", p);
Expand All @@ -101,4 +106,17 @@ public static void process(String sql, List<?>[] expectedResults) throws Excepti
assertEquals("SELECT * FROM OBJECTTABLE(LANGUAGE 'x' 'teiid_context' COLUMNS y string 'teiid_row.userName') AS X", c.clone().toString());
}

@Test public void testArray() throws Exception {
String sql = "select x.* from bqt1.smalla, objecttable('ov' passing objectvalue as ov COLUMNS x string 'teiid_row', y integer 'teiid_row_number') x"; //$NON-NLS-1$

List<?>[] expected = new List[] {
Arrays.asList("hello", 1),
Arrays.asList("world", 2),
Arrays.asList("x", 1),
Arrays.asList("y", 2),
};

process(sql, expected, new List<?>[] {Collections.singletonList(new String[] {"hello", "world"}), Arrays.asList(new ArrayImpl("x", "y"))});
}

}

0 comments on commit 287163c

Please sign in to comment.