public List<SchemaField> convertToSchema(ResultSet dbColumns) throws SQLException { List<SchemaField> schemaFields = Lists.newArrayList(); while (dbColumns.next()) { String columnName = dbColumns.getString("COLUMN_NAME"); FieldType fieldType = fromSql(dbColumns.getInt("DATA_TYPE"), dbColumns.getString("TYPE_NAME"), s -> fromPrestoType(s)); schemaFields.add(new SchemaField(columnName, fieldType)); } return schemaFields.isEmpty() ? null : schemaFields; }
String colName = columns.getString("COLUMN_NAME"); strings.add(colName); currentFields.add(new SchemaField(colName, fromSql(columns.getInt("DATA_TYPE"), columns.getString("TYPE_NAME"), this::fromPrestoType))); return f; }) .map(f -> format("\"%s\" %s", f.getName(), toSql(f.getType()))) .collect(Collectors.joining(", ")); if (queryEnd.isEmpty()) { .map(f -> format("ALTER TABLE %s.\"%s\".\"%s\" ADD COLUMN \"%s\" %s", config.getColdStorageConnector(), project, collection, f.getName(), toSql(f.getType()))) .forEach(q -> { try {
public static String toSql(FieldType type) { switch (type) { case INTEGER: return "INT"; case DECIMAL: return "DECIMAL"; case LONG: return "BIGINT"; case STRING: return "VARCHAR"; case BINARY: return "VARBINARY"; case BOOLEAN: case DATE: case TIME: case TIMESTAMP: return type.name(); case DOUBLE: return "DOUBLE"; default: if (type.isArray()) { return "ARRAY<" + toSql(type.getArrayElementType()) + ">"; } if (type.isMap()) { return "MAP<VARCHAR, " + toSql(type.getMapValueType()) + ">"; } throw new IllegalStateException("sql type couldn't converted to fieldtype"); } }
public static FieldType fromSql(int sqlType, String typeName) { return fromSql(sqlType, typeName, name -> { if (name.startsWith("_")) { if (name.startsWith("_int")) { return FieldType.ARRAY_LONG; } if (name.equals("_bool")) { return FieldType.ARRAY_BOOLEAN; } if (name.equals("_text") || name.equals("_varchar")) { return FieldType.ARRAY_STRING; } if (name.startsWith("_float")) { return FieldType.ARRAY_DOUBLE; } } if (name.equals("jsonb")) { return FieldType.MAP_STRING; } if (name.equals("json")) { return FieldType.STRING; } if (name.equals("unknown")) { return FieldType.STRING; } throw new UnsupportedOperationException(format("type '%s' is not supported.", typeName)); }); }
public List<SchemaField> getMetadata(String project) { checkProject(project); LinkedList<SchemaField> columns = new LinkedList<>(); try (Connection conn = queryExecutor.getConnection()) { DatabaseMetaData metaData = conn.getMetaData(); ProjectCollection userTable = getUserTable(project, false); ResultSet indexInfo = metaData.getIndexInfo(null, userTable.project, userTable.collection, true, false); ResultSet dbColumns = metaData.getColumns(null, userTable.project, userTable.collection, null); Set<String> uniqueColumns = Sets.newHashSet(); while (indexInfo.next()) { uniqueColumns.add(indexInfo.getString("COLUMN_NAME")); } while (dbColumns.next()) { String columnName = dbColumns.getString("COLUMN_NAME"); FieldType fieldType; try { fieldType = fromSql(dbColumns.getInt("DATA_TYPE"), dbColumns.getString("TYPE_NAME")); } catch (IllegalStateException e) { continue; } columns.add(new SchemaField(columnName, fieldType, null, null, null)); } return columns; } catch (SQLException e) { throw new RuntimeException("Couldn't get metadata from plugin.user.storage", e); } }
private Map<String, List<SchemaField>> getAllSchema(Connection connection, String project) throws SQLException { BaseConnection pgConnection = connection.unwrap(BaseConnection.class); Map<String, List<SchemaField>> map = new HashMap<>(); ResultSet resultSet = pgConnection.execSQLQuery(format("SELECT c.relname, a.attname, typname\n" + "FROM pg_catalog.pg_class c\n" + " JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n" + " LEFT JOIN pg_inherits i ON (i.inhrelid = c.oid)\n" + " JOIN pg_attribute a ON (a.attrelid=c.oid)\n" + " JOIN pg_type t ON (a.atttypid = t.oid)\n" + " WHERE n.nspname = '%s' and c.relkind IN ('r', 'p', '') and i.inhrelid is null\n" + " AND n.nspname <> 'pg_catalog'\n" + " AND n.nspname <> 'information_schema'\n" + " AND n.nspname !~ '^pg_toast' \n" + " AND a.attnum > 0 AND NOT a.attisdropped AND c.relname not like '\\$%%' ESCAPE '\\' and c.relname != '_users' AND a.attname != '$server_time'", checkLiteral(project))); while (resultSet.next()) { String columnName = resultSet.getString(2); FieldType fieldType; try { fieldType = fromSql(pgConnection.getTypeInfo().getSQLType(resultSet.getString(3)), resultSet.getString(3)); } catch (IllegalStateException e) { continue; } map.computeIfAbsent(resultSet.getString(1), (k) -> new ArrayList<>()).add(new SchemaField(columnName, fieldType)); } return map; }
public CompletableFuture<List<SchemaField>> schemaTable(String project, String schema, String table) { CustomDataSource customDataSource = getDatabase(project, schema); List<SchemaField> builder = new ArrayList<>(); return CompletableFuture.supplyAsync(() -> { SupportedCustomDatabase source = SupportedCustomDatabase.getAdapter(customDataSource.type); try (Connection conn = source.getDataSource().openConnection(customDataSource.options)) { ResultSet dbColumns = conn.getMetaData().getColumns(null, customDataSource.options.getSchema(), table, null); while (dbColumns.next()) { String columnName = dbColumns.getString("COLUMN_NAME"); FieldType fieldType; try { fieldType = fromSql(dbColumns.getInt("DATA_TYPE"), dbColumns.getString("TYPE_NAME")); } catch (UnsupportedOperationException e) { continue; } builder.add(new SchemaField(columnName, fieldType)); } return builder; } catch (SQLException e) { throw Throwables.propagate(e); } }, executor); }
FieldType fieldType; try { fieldType = fromSql(pgConnection.getTypeInfo().getSQLType(resultSet.getString(2)), resultSet.getString(2)); } catch (IllegalStateException e) {
String key = metaData.getColumnName(i); if (!key.equals(PRIMARY_KEY)) { FieldType fieldType = fromSql(metaData.getColumnType(i), metaData.getColumnTypeName(i)); JsonNode value = setValues(resultSet, i, fieldType); if (!value.equals(NullNode.getInstance())) {
FieldType type; try { type = fromSql(metaData.getColumnType(i), metaData.getColumnTypeName(i)); } catch (UnsupportedOperationException e) { LOGGER.warn(e.getMessage());