protected static ColumnMetaData drillColumnMetaData(String name, int index, Class<?> type, boolean notNullable) { TypeInfo pair = TypeInfo.get(type); ColumnMetaData.Rep rep = ColumnMetaData.Rep.VALUE_MAP.get(type); ColumnMetaData.AvaticaType scalarType = ColumnMetaData.scalar(pair.sqlType, pair.sqlTypeName, rep); return new ColumnMetaData( index, false, true, false, false, notNullable ? DatabaseMetaData.columnNoNulls : DatabaseMetaData.columnNullable, true, -1, name, name, null, 0, 0, null, null, scalarType, true, false, false, scalarType.columnClassName()); }
protected static ColumnMetaData.StructType drillFieldMetaData(Class<?> clazz) { final List<ColumnMetaData> list = new ArrayList<>(); for (Field field : clazz.getFields()) { if (Modifier.isPublic(field.getModifiers()) && !Modifier.isStatic(field.getModifiers())) { NotNull notNull = field.getAnnotation(NotNull.class); boolean notNullable = (notNull != null || field.getType().isPrimitive()); list.add( drillColumnMetaData( AvaticaUtils.camelToUpper(field.getName()), list.size(), field.getType(), notNullable)); } } return ColumnMetaData.struct(list); }
@Override public QueryResult executeQuery(String sql, List<Object> paramValues, Map<String, String> queryToggles) throws IOException { List<Object> data = new ArrayList<Object>(); Object[] row = new Object[] { "foo", "bar", "tool" }; data.add(row); List<ColumnMetaData> meta = new ArrayList<ColumnMetaData>(); meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.VARCHAR, "varchar", Rep.STRING), true)); meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.VARCHAR, "varchar", Rep.STRING), true)); meta.add(ColumnMetaData.dummy(ColumnMetaData.scalar(Types.VARCHAR, "varchar", Rep.STRING), true)); return new QueryResult(meta, data); }
final ColumnMetaData.Rep rep = ColumnMetaData.Rep.of(clazz); assert rep != null; return ColumnMetaData.array(componentType, typeName, rep); } else { int typeOrdinal = getTypeOrdinal(type); field.getType(), null, null)); return ColumnMetaData.struct(columns); case ExtraSqlTypes.GEOMETRY: typeOrdinal = Types.VARCHAR; final ColumnMetaData.Rep rep = ColumnMetaData.Rep.of(clazz); assert rep != null; return ColumnMetaData.scalar(typeOrdinal, typeName, rep);
/** * Gets AvaticaType carrying both JDBC {@code java.sql.Type.*} type code * and SQL type name for given SQL type name. */ private static AvaticaType getAvaticaType(String sqlTypeName) { final int jdbcTypeId = Types.getJdbcTypeCode(sqlTypeName); return ColumnMetaData.scalar( jdbcTypeId, sqlTypeName, Rep.BOOLEAN /* dummy value, unused */ ); }
final ColumnMetaData.AvaticaType t; if (sqlType == SqlType.ARRAY || sqlType == SqlType.STRUCT || sqlType == SqlType.MULTISET) { ColumnMetaData.AvaticaType arrayValueType = ColumnMetaData.scalar(Types.JAVA_OBJECT, metaData.getColumnTypeName(i), ColumnMetaData.Rep.OBJECT); t = ColumnMetaData.array(arrayValueType, metaData.getColumnTypeName(i), rep); } else { t = ColumnMetaData.scalar(metaData.getColumnType(i), metaData.getColumnTypeName(i), rep); new ColumnMetaData(i - 1, metaData.isAutoIncrement(i), metaData.isCaseSensitive(i), metaData.isSearchable(i), metaData.isCurrency(i), metaData.isNullable(i),
public static AvaticaType fromProto(Common.AvaticaType proto) { Common.Rep repProto = proto.getRep(); Rep rep = Rep.valueOf(repProto.name()); AvaticaType type; if (proto.hasComponent()) { // ArrayType // recurse on the type for the array elements AvaticaType nestedType = AvaticaType.fromProto(proto.getComponent()); type = ColumnMetaData.array(nestedType, proto.getName(), rep); } else if (proto.getColumnsCount() > 0) { // StructType List<ColumnMetaData> columns = new ArrayList<>(proto.getColumnsCount()); for (Common.ColumnMetaData protoColumn : proto.getColumnsList()) { columns.add(ColumnMetaData.fromProto(protoColumn)); } type = ColumnMetaData.struct(columns); } else { // ScalarType type = ColumnMetaData.scalar(proto.getId(), proto.getName(), rep); } return type; }
final int displaySize = Types.getJdbcDisplaySize(rpcDataType); ColumnMetaData col = new ColumnMetaData(
private static ColumnMetaData getArrayColumnMetaData(ScalarType componentType, int index, String name) { ArrayType arrayType = ColumnMetaData.array(componentType, "Array", Rep.ARRAY); return new ColumnMetaData( index, false, true, false, false, DatabaseMetaData.columnNullable, true, -1, name, name, null, 0, 0, null, null, arrayType, true, false, false, "ARRAY"); }
@Test public void resultSetFromArray() throws Exception { ScalarType intType = ColumnMetaData.scalar(Types.INTEGER, "INTEGER", Rep.INTEGER); ArrayType arrayType = ColumnMetaData.array(intType, "INTEGER", Rep.INTEGER); ColumnMetaData arrayMetaData = MetaImpl.columnMetaData("MY_ARRAY", 1, arrayType, false); ArrayImpl.Factory factory = new ArrayFactoryImpl(Unsafe.localCalendar().getTimeZone());
StructType structType = ColumnMetaData.struct(Arrays.asList(intMetaData, stringMetaData)); Struct struct3 = new StructImpl(Arrays.<Object>asList(3)); Struct struct4 = new StructImpl(Arrays.<Object>asList(4, "four")); ArrayType arrayType = ColumnMetaData.array(structType, "OBJECT", Rep.STRUCT); ColumnMetaData arrayMetaData = MetaImpl.columnMetaData("MY_ARRAY", 1, arrayType, false); ArrayImpl.Factory factory = new ArrayFactoryImpl(Unsafe.localCalendar().getTimeZone());
@Override public Array createArray(AvaticaType elementType, Iterable<Object> elements) { final ArrayType array = ColumnMetaData.array(elementType, elementType.name, Rep.ARRAY); final List<ColumnMetaData> types = Collections.singletonList(ColumnMetaData.dummy(array, true)); // Avoid creating a new List if we already have a List List<Object> elementList; if (elements instanceof List) { elementList = (List<Object>) elements; } else { elementList = new ArrayList<>(); for (Object element : elements) { elementList.add(element); } } try (ListIteratorCursor cursor = new ListIteratorCursor(createRowForArrayData(elementList))) { List<Accessor> accessor = cursor.createAccessors(types, Unsafe.localCalendar(), this); assert 1 == accessor.size(); return new ArrayImpl(elementList, (ArrayAccessor) accessor.get(0)); } }
@Override public ResultSet create(ColumnMetaData.AvaticaType elementType, Iterable<Object> iterable) { final List<ColumnMetaData> columnMetaDataList; if (elementType instanceof ColumnMetaData.StructType) { columnMetaDataList = ((ColumnMetaData.StructType) elementType).columns; } else { columnMetaDataList = ImmutableList.of(ColumnMetaData.dummy(elementType, false)); } final CalcitePrepare.CalciteSignature signature = (CalcitePrepare.CalciteSignature) this.signature; final CalcitePrepare.CalciteSignature<Object> newSignature = new CalcitePrepare.CalciteSignature<>(signature.sql, signature.parameters, signature.internalParameters, signature.rowType, columnMetaDataList, Meta.CursorFactory.ARRAY, signature.rootSchema, ImmutableList.<RelCollation>of(), -1, null); ResultSetMetaData subResultSetMetaData = new AvaticaResultSetMetaData(statement, null, newSignature); final QuarkResultSet resultSet = new QuarkResultSet(statement, signature, subResultSetMetaData, localCalendar.getTimeZone(), new Meta.Frame(0, true, iterable)); final Cursor cursor = resultSet.createCursor(elementType, iterable); return resultSet.execute2(cursor, columnMetaDataList); }
private ColumnMetaData.AvaticaType avaticaType(JavaTypeFactory typeFactory, RelDataType type, RelDataType fieldType) { final String typeName = getTypeName(type); if (type.getComponentType() != null) { final ColumnMetaData.AvaticaType componentType = avaticaType(typeFactory, type.getComponentType(), null); final Type clazz = typeFactory.getJavaClass(type.getComponentType()); final ColumnMetaData.Rep rep = ColumnMetaData.Rep.of(clazz); assert rep != null; return ColumnMetaData.array(componentType, typeName, rep); } else { final int typeOrdinal = getTypeOrdinal(type); switch (typeOrdinal) { case Types.STRUCT: final List<ColumnMetaData> columns = new ArrayList<>(); for (RelDataTypeField field : type.getFieldList()) { columns.add( metaData(typeFactory, field.getIndex(), field.getName(), field.getType(), null, null)); } return ColumnMetaData.struct(columns); default: final Type clazz = typeFactory.getJavaClass(Util.first(fieldType, type)); final ColumnMetaData.Rep rep = ColumnMetaData.Rep.of(clazz); assert rep != null; return ColumnMetaData.scalar(typeOrdinal, typeName, rep); } } }
/** * Gets AvaticaType carrying both JDBC {@code java.sql.Type.*} type code * and SQL type name for given RPC-level type (from batch schema). */ private static AvaticaType getAvaticaType( MajorType rpcDateType ) { final String sqlTypeName = Types.getSqlTypeName( rpcDateType ); final int jdbcTypeId = Types.getJdbcTypeCode( sqlTypeName ); return ColumnMetaData.scalar( jdbcTypeId, sqlTypeName, Rep.BOOLEAN /* dummy value, unused */ ); }
final ColumnMetaData.AvaticaType t; if (sqlType == SqlType.ARRAY || sqlType == SqlType.STRUCT || sqlType == SqlType.MULTISET) { ColumnMetaData.AvaticaType arrayValueType = ColumnMetaData.scalar(Types.JAVA_OBJECT, metaData.getColumnTypeName(i), ColumnMetaData.Rep.OBJECT); t = ColumnMetaData.array(arrayValueType, metaData.getColumnTypeName(i), rep); } else { t = ColumnMetaData.scalar(metaData.getColumnType(i), metaData.getColumnTypeName(i), rep); new ColumnMetaData(i - 1, metaData.isAutoIncrement(i), metaData.isCaseSensitive(i), metaData.isSearchable(i), metaData.isCurrency(i), metaData.isNullable(i),
public static AvaticaType fromProto(Common.AvaticaType proto) { Common.Rep repProto = proto.getRep(); Rep rep = Rep.valueOf(repProto.name()); AvaticaType type; if (proto.hasComponent()) { // ArrayType // recurse on the type for the array elements AvaticaType nestedType = AvaticaType.fromProto(proto.getComponent()); type = ColumnMetaData.array(nestedType, proto.getName(), rep); } else if (proto.getColumnsCount() > 0) { // StructType List<ColumnMetaData> columns = new ArrayList<>(proto.getColumnsCount()); for (Common.ColumnMetaData protoColumn : proto.getColumnsList()) { columns.add(ColumnMetaData.fromProto(protoColumn)); } type = ColumnMetaData.struct(columns); } else { // ScalarType type = ColumnMetaData.scalar(proto.getId(), proto.getName(), rep); } return type; }
public static ColumnMetaData columnMetaData(String name, int index, AvaticaType type, int columnNullable) { return new ColumnMetaData( index, false, true, false, false, columnNullable, true, -1, name, name, null, 0, 0, null, null, type, true, false, false, type.columnClassName()); }
private static ColumnMetaData getArrayColumnMetaData(ScalarType componentType, int index, String name) { ArrayType arrayType = ColumnMetaData.array(componentType, "Array", Rep.ARRAY); return new ColumnMetaData( index, false, true, false, false, DatabaseMetaData.columnNullable, true, -1, name, name, null, 0, 0, null, null, arrayType, true, false, false, "ARRAY"); }
@Test public void resultSetFromArray() throws Exception { ScalarType intType = ColumnMetaData.scalar(Types.INTEGER, "INTEGER", Rep.INTEGER); ArrayType arrayType = ColumnMetaData.array(intType, "INTEGER", Rep.INTEGER); ColumnMetaData arrayMetaData = MetaImpl.columnMetaData("MY_ARRAY", 1, arrayType, false); ArrayImpl.Factory factory = new ArrayFactoryImpl(Unsafe.localCalendar().getTimeZone());