use of org.apache.flink.table.api.config.TableConfigOptions.CatalogPlanRestore in project flink by apache.
the class LogicalTypeJsonDeserializer method deserializeDistinctType.
private static LogicalType deserializeDistinctType(JsonNode logicalTypeNode, SerdeContext serdeContext) {
final ObjectIdentifier identifier = ObjectIdentifierJsonDeserializer.deserialize(logicalTypeNode.get(FIELD_NAME_OBJECT_IDENTIFIER).asText(), serdeContext);
final CatalogPlanRestore restoreStrategy = serdeContext.getConfiguration().get(TableConfigOptions.PLAN_RESTORE_CATALOG_OBJECTS);
switch(restoreStrategy) {
case ALL:
if (logicalTypeNode.has(FIELD_NAME_SOURCE_TYPE)) {
return deserializeDistinctTypeFromPlan(identifier, logicalTypeNode, serdeContext);
}
return deserializeUserDefinedTypeFromCatalog(identifier, serdeContext);
case ALL_ENFORCED:
return deserializeDistinctTypeFromPlan(identifier, logicalTypeNode, serdeContext);
case IDENTIFIER:
return deserializeUserDefinedTypeFromCatalog(identifier, serdeContext);
default:
throw new TableException("Unsupported catalog restore strategy.");
}
}
use of org.apache.flink.table.api.config.TableConfigOptions.CatalogPlanRestore in project flink by apache.
the class ContextResolvedTableJsonDeserializer method deserialize.
@Override
public ContextResolvedTable deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
final CatalogPlanRestore planRestoreOption = SerdeContext.get(ctx).getConfiguration().get(PLAN_RESTORE_CATALOG_OBJECTS);
final CatalogManager catalogManager = SerdeContext.get(ctx).getFlinkContext().getCatalogManager();
final ObjectNode objectNode = jsonParser.readValueAsTree();
// Deserialize the two fields, if available
final ObjectIdentifier identifier = JsonSerdeUtil.deserializeOptionalField(objectNode, FIELD_NAME_IDENTIFIER, ObjectIdentifier.class, jsonParser.getCodec(), ctx).orElse(null);
ResolvedCatalogTable resolvedCatalogTable = JsonSerdeUtil.deserializeOptionalField(objectNode, FIELD_NAME_CATALOG_TABLE, ResolvedCatalogTable.class, jsonParser.getCodec(), ctx).orElse(null);
if (identifier == null && resolvedCatalogTable == null) {
throw new ValidationException(String.format("The input JSON is invalid because it doesn't contain '%s', nor the '%s'.", FIELD_NAME_IDENTIFIER, FIELD_NAME_CATALOG_TABLE));
}
if (identifier == null) {
if (isLookupForced(planRestoreOption)) {
throw missingIdentifier();
}
return ContextResolvedTable.anonymous(resolvedCatalogTable);
}
Optional<ContextResolvedTable> contextResolvedTableFromCatalog = isLookupEnabled(planRestoreOption) ? catalogManager.getTable(identifier) : Optional.empty();
// If we have a schema from the plan and from the catalog, we need to check they match.
if (contextResolvedTableFromCatalog.isPresent() && resolvedCatalogTable != null) {
ResolvedSchema schemaFromPlan = resolvedCatalogTable.getResolvedSchema();
ResolvedSchema schemaFromCatalog = contextResolvedTableFromCatalog.get().getResolvedSchema();
if (!areResolvedSchemasEqual(schemaFromPlan, schemaFromCatalog)) {
throw schemaNotMatching(identifier, schemaFromPlan, schemaFromCatalog);
}
}
if (resolvedCatalogTable == null || isLookupForced(planRestoreOption)) {
if (!isLookupEnabled(planRestoreOption)) {
throw lookupDisabled(identifier);
}
// We use what is stored inside the catalog
return contextResolvedTableFromCatalog.orElseThrow(() -> missingTableFromCatalog(identifier, isLookupForced(planRestoreOption)));
}
if (contextResolvedTableFromCatalog.isPresent()) {
// SCHEMA, so we just need to return the catalog query result
if (objectNode.at("/" + FIELD_NAME_CATALOG_TABLE + "/" + OPTIONS).isMissingNode()) {
return contextResolvedTableFromCatalog.get();
}
return contextResolvedTableFromCatalog.flatMap(ContextResolvedTable::getCatalog).map(c -> ContextResolvedTable.permanent(identifier, c, resolvedCatalogTable)).orElseGet(() -> ContextResolvedTable.temporary(identifier, resolvedCatalogTable));
}
return ContextResolvedTable.temporary(identifier, resolvedCatalogTable);
}
use of org.apache.flink.table.api.config.TableConfigOptions.CatalogPlanRestore in project flink by apache.
the class RexNodeJsonDeserializer method deserializeCatalogFunction.
private static SqlOperator deserializeCatalogFunction(JsonNode jsonNode, SqlSyntax syntax, SerdeContext serdeContext) {
final CatalogPlanRestore restoreStrategy = serdeContext.getConfiguration().get(PLAN_RESTORE_CATALOG_OBJECTS);
final FunctionIdentifier identifier = FunctionIdentifier.of(ObjectIdentifierJsonDeserializer.deserialize(jsonNode.required(FIELD_NAME_CATALOG_NAME).asText(), serdeContext));
switch(restoreStrategy) {
case ALL:
{
final Optional<SqlOperator> lookupOperator = lookupOptionalSqlOperator(identifier, syntax, serdeContext, false);
if (lookupOperator.isPresent()) {
return lookupOperator.get();
} else if (jsonNode.has(FIELD_NAME_CLASS)) {
return deserializeFunctionClass(jsonNode, serdeContext);
}
throw missingFunctionFromCatalog(identifier, false);
}
case ALL_ENFORCED:
{
if (jsonNode.has(FIELD_NAME_CLASS)) {
return deserializeFunctionClass(jsonNode, serdeContext);
}
final Optional<SqlOperator> lookupOperator = lookupOptionalSqlOperator(identifier, syntax, serdeContext, false);
if (lookupOperator.map(RexNodeJsonDeserializer::isTemporary).orElse(false)) {
return lookupOperator.get();
}
throw lookupDisabled(identifier);
}
case IDENTIFIER:
final Optional<SqlOperator> lookupOperator = lookupOptionalSqlOperator(identifier, syntax, serdeContext, true);
if (lookupOperator.isPresent()) {
return lookupOperator.get();
} else {
throw missingFunctionFromCatalog(identifier, true);
}
default:
throw new TableException("Unsupported restore strategy: " + restoreStrategy);
}
}
use of org.apache.flink.table.api.config.TableConfigOptions.CatalogPlanRestore in project flink by apache.
the class LogicalTypeJsonDeserializer method deserializeStructuredType.
private static LogicalType deserializeStructuredType(JsonNode logicalTypeNode, SerdeContext serdeContext) {
// inline structured types have no object identifier
if (!logicalTypeNode.has(FIELD_NAME_OBJECT_IDENTIFIER)) {
return deserializeStructuredTypeFromPlan(logicalTypeNode, serdeContext);
}
// for catalog structured types
final ObjectIdentifier identifier = ObjectIdentifierJsonDeserializer.deserialize(logicalTypeNode.get(FIELD_NAME_OBJECT_IDENTIFIER).asText(), serdeContext);
final CatalogPlanRestore restoreStrategy = serdeContext.getConfiguration().get(TableConfigOptions.PLAN_RESTORE_CATALOG_OBJECTS);
switch(restoreStrategy) {
case ALL:
if (logicalTypeNode.has(FIELD_NAME_ATTRIBUTES)) {
return deserializeStructuredTypeFromPlan(logicalTypeNode, serdeContext);
}
return deserializeUserDefinedTypeFromCatalog(identifier, serdeContext);
case ALL_ENFORCED:
return deserializeStructuredTypeFromPlan(logicalTypeNode, serdeContext);
case IDENTIFIER:
return deserializeUserDefinedTypeFromCatalog(identifier, serdeContext);
default:
throw new TableException("Unsupported catalog restore strategy.");
}
}
Aggregations