/** Deduces the names and types of a table's columns by reading the first line of a CSV file. */ static RelDataType deduceRowType( JavaTypeFactory typeFactory, File file, List<CsvFieldType> fieldTypes) { final List<RelDataType> types = new ArrayList<RelDataType>(); final List<String> names = new ArrayList<String>(); CSVReader reader = null; try { reader = openCsv(file); final String[] strings = reader.readNext(); for (String string : strings) { final String name; final CsvFieldType fieldType; final int colon = string.indexOf(':'); if (colon >= 0) { name = string.substring(0, colon); String typeString = string.substring(colon + 1); fieldType = CsvFieldType.of(typeString); if (fieldType == null) { System.out.println( "WARNING: Found unknown type: " + typeString + " in file: " + file.getAbsolutePath() + " for column: " + name + ". Will assume the type of column is string"); } } else { name = string; fieldType = null; } final RelDataType type; if (fieldType == null) { type = typeFactory.createJavaType(String.class); } else { type = fieldType.toType(typeFactory); } names.add(name); types.add(type); if (fieldTypes != null) { fieldTypes.add(fieldType); } } } catch (IOException e) { // ignore } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { // ignore } } } if (names.isEmpty()) { names.add("line"); types.add(typeFactory.createJavaType(String.class)); } return typeFactory.createStructType(Pair.zip(names, types)); }
@Override public String visitLiteral(RexLiteral rexLiteral) { Object v = rexLiteral.getValue(); RelDataType ty = rexLiteral.getType(); switch (rexLiteral.getTypeName()) { case BOOLEAN: return v.toString(); case CHAR: return CompilerUtil.escapeJavaString(((NlsString) v).getValue(), true); case NULL: return "((" + ((Class<?>) typeFactory.getJavaClass(ty)).getCanonicalName() + ")null)"; case DOUBLE: case BIGINT: case DECIMAL: switch (ty.getSqlTypeName()) { case TINYINT: case SMALLINT: case INTEGER: return Long.toString(((BigDecimal) v).longValueExact()); case BIGINT: return Long.toString(((BigDecimal) v).longValueExact()) + 'L'; case DECIMAL: case FLOAT: case REAL: case DOUBLE: return Util.toScientificNotation((BigDecimal) v); } break; default: throw new UnsupportedOperationException(); } return null; }
// Only generate inline expressions when comparing primitive types private boolean primitiveCompareExpr(SqlOperator op, RelDataType type) { final Primitive primitive = Primitive.ofBoxOr(typeFactory.getJavaClass(type)); return primitive != null && (op == LESS_THAN || op == LESS_THAN_OR_EQUAL || op == GREATER_THAN || op == GREATER_THAN_OR_EQUAL); }
private String javaTypeName(RexNode node) { Type ty = typeFactory.getJavaClass(node.getType()); return ((Class<?>) ty).getCanonicalName(); }