Skip to content

Commit f4ce2a2

Browse files
committed
Deprecate table layouts
Introduce a usesLegacyMetadata() method to ConnectorMetadata for connectors to indicate if they use the legacy Table Layouts feature. The method returns true by default during the transition period. The following methods are deprecated: ConnectorMetadata.getTableLayouts() ConnectorMetadata.getTableLayout() ConnectorMetadata.getInfo(ConnectorTableLayoutHandle) ConnectorHandleResolver.getTableLayoutHandleClass() ConnectorSplitManager.getSplits(..., ConnectorTableLayoutHandle, ...) Connectors that do not support Table Layouts need to implement new methods instead: ConnectorMetadata.getTableProperties() ConnectorMetadata.getInto(ConnectorTableHandle) ConnectorSplitManager.getSplits(..., ConnectorTableHandle, ...)
1 parent f04adeb commit f4ce2a2

21 files changed

+380
-101
lines changed

presto-main/src/main/java/io/prestosql/connector/system/GlobalSystemConnector.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.prestosql.spi.connector.ConnectorPageSourceProvider;
2323
import io.prestosql.spi.connector.ConnectorSession;
2424
import io.prestosql.spi.connector.ConnectorSplitManager;
25+
import io.prestosql.spi.connector.ConnectorSplitSource;
2526
import io.prestosql.spi.connector.ConnectorTableHandle;
2627
import io.prestosql.spi.connector.ConnectorTableLayout;
2728
import io.prestosql.spi.connector.ConnectorTableLayoutHandle;
@@ -130,8 +131,13 @@ public Map<SchemaTableName, List<ColumnMetadata>> listTableColumns(ConnectorSess
130131
@Override
131132
public ConnectorSplitManager getSplitManager()
132133
{
133-
return (transactionHandle, session, layout, splitSchedulingStrategy) -> {
134-
throw new UnsupportedOperationException();
134+
return new ConnectorSplitManager()
135+
{
136+
@Override
137+
public ConnectorSplitSource getSplits(ConnectorTransactionHandle transaction, ConnectorSession session, ConnectorTableHandle table, SplitSchedulingStrategy splitSchedulingStrategy)
138+
{
139+
throw new UnsupportedOperationException();
140+
}
135141
};
136142
}
137143

presto-main/src/main/java/io/prestosql/metadata/Metadata.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@ public interface Metadata
7373

7474
Optional<TableHandle> getTableHandleForStatisticsCollection(Session session, QualifiedObjectName tableName, Map<String, Object> analyzeProperties);
7575

76+
@Deprecated
7677
Optional<TableLayoutResult> getLayout(Session session, TableHandle tableHandle, Constraint<ColumnHandle> constraint, Optional<Set<ColumnHandle>> desiredColumns);
7778

78-
TableLayout getLayout(Session session, TableHandle handle);
79+
TableProperties getTableProperties(Session session, TableHandle handle);
7980

8081
/**
8182
* Return a table handle whose partitioning is converted to the provided partitioning handle,
@@ -380,4 +381,7 @@ public interface Metadata
380381
ColumnPropertyManager getColumnPropertyManager();
381382

382383
AnalyzePropertyManager getAnalyzePropertyManager();
384+
385+
@Deprecated
386+
boolean usesLegacyTableLayouts(Session session, TableHandle table);
383387
}

presto-main/src/main/java/io/prestosql/metadata/MetadataManager.java

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import io.prestosql.spi.connector.ConnectorTableLayoutHandle;
4646
import io.prestosql.spi.connector.ConnectorTableLayoutResult;
4747
import io.prestosql.spi.connector.ConnectorTableMetadata;
48+
import io.prestosql.spi.connector.ConnectorTableProperties;
4849
import io.prestosql.spi.connector.ConnectorTransactionHandle;
4950
import io.prestosql.spi.connector.ConnectorViewDefinition;
5051
import io.prestosql.spi.connector.Constraint;
@@ -88,6 +89,7 @@
8889
import java.util.concurrent.ConcurrentMap;
8990

9091
import static com.google.common.base.Preconditions.checkArgument;
92+
import static com.google.common.base.Preconditions.checkState;
9193
import static com.google.common.collect.ImmutableSet.toImmutableSet;
9294
import static io.prestosql.metadata.QualifiedObjectName.convertFromSchemaTableName;
9395
import static io.prestosql.metadata.ViewDefinition.ViewColumn;
@@ -391,6 +393,9 @@ public Optional<TableLayoutResult> getLayout(Session session, TableHandle table,
391393

392394
CatalogMetadata catalogMetadata = getCatalogMetadata(session, connectorId);
393395
ConnectorMetadata metadata = catalogMetadata.getMetadataFor(connectorId);
396+
397+
checkState(metadata.usesLegacyTableLayouts(), "getLayout() was called even though connector doesn't support legacy Table Layout");
398+
394399
ConnectorTransactionHandle transaction = catalogMetadata.getTransactionHandleFor(connectorId);
395400
ConnectorSession connectorSession = session.toConnectorSession(connectorId);
396401
List<ConnectorTableLayoutResult> layouts = metadata.getTableLayouts(connectorSession, connectorTable, constraint, desiredColumns);
@@ -405,23 +410,27 @@ public Optional<TableLayoutResult> getLayout(Session session, TableHandle table,
405410
ConnectorTableLayout tableLayout = layouts.get(0).getTableLayout();
406411
return Optional.of(new TableLayoutResult(
407412
new TableHandle(connectorId, connectorTable, transaction, Optional.of(tableLayout.getHandle())),
408-
new TableLayout(connectorId, transaction, tableLayout),
413+
new TableProperties(connectorId, transaction, new ConnectorTableProperties(tableLayout)),
409414
layouts.get(0).getUnenforcedConstraint()));
410415
}
411416

412417
@Override
413-
public TableLayout getLayout(Session session, TableHandle handle)
418+
public TableProperties getTableProperties(Session session, TableHandle handle)
414419
{
415420
ConnectorId connectorId = handle.getConnectorId();
416421
CatalogMetadata catalogMetadata = getCatalogMetadata(session, connectorId);
417422
ConnectorMetadata metadata = catalogMetadata.getMetadataFor(connectorId);
418423
ConnectorSession connectorSession = session.toConnectorSession(connectorId);
419424

420-
return handle.getLayout()
421-
.map(layout -> new TableLayout(connectorId, handle.getTransaction(), metadata.getTableLayout(connectorSession, layout)))
422-
.orElseGet(() -> getLayout(session, handle, Constraint.alwaysTrue(), Optional.empty())
423-
.get()
424-
.getLayout());
425+
if (metadata.usesLegacyTableLayouts()) {
426+
return handle.getLayout()
427+
.map(layout -> new TableProperties(connectorId, handle.getTransaction(), new ConnectorTableProperties(metadata.getTableLayout(connectorSession, layout))))
428+
.orElseGet(() -> getLayout(session, handle, Constraint.alwaysTrue(), Optional.empty())
429+
.get()
430+
.getTableProperties());
431+
}
432+
433+
return new TableProperties(connectorId, handle.getTransaction(), metadata.getTableProperties(connectorSession, handle.getConnectorHandle()));
425434
}
426435

427436
@Override
@@ -461,14 +470,18 @@ public Optional<Object> getInfo(Session session, TableHandle handle)
461470
ConnectorId connectorId = handle.getConnectorId();
462471
ConnectorMetadata metadata = getMetadata(session, connectorId);
463472

464-
ConnectorTableLayoutHandle layoutHandle = handle.getLayout()
465-
.orElseGet(() -> getLayout(session, handle, Constraint.alwaysTrue(), Optional.empty())
466-
.get()
467-
.getNewTableHandle()
468-
.getLayout()
469-
.get());
473+
if (usesLegacyTableLayouts(session, handle)) {
474+
ConnectorTableLayoutHandle layoutHandle = handle.getLayout()
475+
.orElseGet(() -> getLayout(session, handle, Constraint.alwaysTrue(), Optional.empty())
476+
.get()
477+
.getNewTableHandle()
478+
.getLayout()
479+
.get());
480+
481+
return metadata.getInfo(layoutHandle);
482+
}
470483

471-
return metadata.getInfo(layoutHandle);
484+
return metadata.getInfo(handle.getConnectorHandle());
472485
}
473486

474487
@Override
@@ -1151,6 +1164,12 @@ public AnalyzePropertyManager getAnalyzePropertyManager()
11511164
return analyzePropertyManager;
11521165
}
11531166

1167+
@Override
1168+
public boolean usesLegacyTableLayouts(Session session, TableHandle table)
1169+
{
1170+
return getMetadata(session, table.getConnectorId()).usesLegacyTableLayouts();
1171+
}
1172+
11541173
private ViewDefinition deserializeView(String data)
11551174
{
11561175
try {

presto-main/src/main/java/io/prestosql/metadata/TableLayoutResult.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@
2323
import static com.google.common.base.Preconditions.checkArgument;
2424
import static java.util.Objects.requireNonNull;
2525

26+
@Deprecated
2627
public class TableLayoutResult
2728
{
2829
private final TableHandle newTableHandle;
29-
private final TableLayout layout;
30+
private final TableProperties layout;
3031
private final TupleDomain<ColumnHandle> unenforcedConstraint;
3132

32-
public TableLayoutResult(TableHandle newTable, TableLayout layout, TupleDomain<ColumnHandle> unenforcedConstraint)
33+
public TableLayoutResult(TableHandle newTable, TableProperties layout, TupleDomain<ColumnHandle> unenforcedConstraint)
3334
{
3435
this.newTableHandle = requireNonNull(newTable, "newTable is null");
3536
this.layout = requireNonNull(layout, "layout is null");
@@ -41,7 +42,7 @@ public TableHandle getNewTableHandle()
4142
return newTableHandle;
4243
}
4344

44-
public TableLayout getLayout()
45+
public TableProperties getTableProperties()
4546
{
4647
return layout;
4748
}

presto-main/src/main/java/io/prestosql/metadata/TableLayout.java renamed to presto-main/src/main/java/io/prestosql/metadata/TableProperties.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import com.google.common.collect.ImmutableList;
1717
import io.prestosql.connector.ConnectorId;
1818
import io.prestosql.spi.connector.ColumnHandle;
19-
import io.prestosql.spi.connector.ConnectorTableLayout;
19+
import io.prestosql.spi.connector.ConnectorTableProperties;
2020
import io.prestosql.spi.connector.ConnectorTransactionHandle;
2121
import io.prestosql.spi.connector.DiscretePredicates;
2222
import io.prestosql.spi.connector.LocalProperty;
@@ -30,41 +30,36 @@
3030

3131
import static java.util.Objects.requireNonNull;
3232

33-
public class TableLayout
33+
public class TableProperties
3434
{
35-
private final ConnectorTableLayout layout;
35+
private final ConnectorTableProperties tableProperties;
3636
private final ConnectorId connectorId;
3737
private final ConnectorTransactionHandle transaction;
3838

39-
public TableLayout(ConnectorId connectorId, ConnectorTransactionHandle transaction, ConnectorTableLayout layout)
39+
public TableProperties(ConnectorId connectorId, ConnectorTransactionHandle transaction, ConnectorTableProperties tableProperties)
4040
{
4141
requireNonNull(connectorId, "connectorId is null");
4242
requireNonNull(transaction, "transaction is null");
43-
requireNonNull(layout, "layout is null");
43+
requireNonNull(tableProperties, "layout is null");
4444

4545
this.connectorId = connectorId;
4646
this.transaction = transaction;
47-
this.layout = layout;
48-
}
49-
50-
public Optional<List<ColumnHandle>> getColumns()
51-
{
52-
return layout.getColumns();
47+
this.tableProperties = tableProperties;
5348
}
5449

5550
public TupleDomain<ColumnHandle> getPredicate()
5651
{
57-
return layout.getPredicate();
52+
return tableProperties.getPredicate();
5853
}
5954

6055
public List<LocalProperty<ColumnHandle>> getLocalProperties()
6156
{
62-
return layout.getLocalProperties();
57+
return tableProperties.getLocalProperties();
6358
}
6459

6560
public Optional<TablePartitioning> getTablePartitioning()
6661
{
67-
return layout.getTablePartitioning()
62+
return tableProperties.getTablePartitioning()
6863
.map(nodePartitioning -> new TablePartitioning(
6964
new PartitioningHandle(
7065
Optional.of(connectorId),
@@ -75,12 +70,12 @@ public Optional<TablePartitioning> getTablePartitioning()
7570

7671
public Optional<Set<ColumnHandle>> getStreamPartitioningColumns()
7772
{
78-
return layout.getStreamPartitioningColumns();
73+
return tableProperties.getStreamPartitioningColumns();
7974
}
8075

8176
public Optional<DiscretePredicates> getDiscretePredicates()
8277
{
83-
return layout.getDiscretePredicates();
78+
return tableProperties.getDiscretePredicates();
8479
}
8580

8681
public static class TablePartitioning

presto-main/src/main/java/io/prestosql/split/SplitManager.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,19 @@ public SplitSource getSplits(Session session, TableHandle table, SplitScheduling
7171

7272
ConnectorSession connectorSession = session.toConnectorSession(connectorId);
7373

74-
ConnectorTableLayoutHandle layout = table.getLayout()
75-
.orElseGet(() -> metadata.getLayout(session, table, Constraint.alwaysTrue(), Optional.empty())
76-
.get()
77-
.getNewTableHandle()
78-
.getLayout().get());
74+
ConnectorSplitSource source;
75+
if (metadata.usesLegacyTableLayouts(session, table)) {
76+
ConnectorTableLayoutHandle layout = table.getLayout()
77+
.orElseGet(() -> metadata.getLayout(session, table, Constraint.alwaysTrue(), Optional.empty())
78+
.get()
79+
.getNewTableHandle()
80+
.getLayout().get());
7981

80-
ConnectorSplitSource source = splitManager.getSplits(
81-
table.getTransaction(),
82-
connectorSession,
83-
layout,
84-
splitSchedulingStrategy);
82+
source = splitManager.getSplits(table.getTransaction(), connectorSession, layout, splitSchedulingStrategy);
83+
}
84+
else {
85+
source = splitManager.getSplits(table.getTransaction(), connectorSession, table.getConnectorHandle(), splitSchedulingStrategy);
86+
}
8587

8688
SplitSource splitSource = new ConnectorAwareSplitSource(connectorId, table.getTransaction(), source);
8789
if (minScheduleSplitBatchSize > 1) {

presto-main/src/main/java/io/prestosql/sql/planner/PlanFragmenter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import io.prestosql.execution.QueryManagerConfig;
2323
import io.prestosql.metadata.Metadata;
2424
import io.prestosql.metadata.TableHandle;
25-
import io.prestosql.metadata.TableLayout.TablePartitioning;
25+
import io.prestosql.metadata.TableProperties.TablePartitioning;
2626
import io.prestosql.spi.PrestoException;
2727
import io.prestosql.spi.connector.ConnectorPartitionHandle;
2828
import io.prestosql.spi.connector.ConnectorPartitioningHandle;
@@ -278,7 +278,7 @@ public PlanNode visitMetadataDelete(MetadataDeleteNode node, RewriteContext<Frag
278278
@Override
279279
public PlanNode visitTableScan(TableScanNode node, RewriteContext<FragmentProperties> context)
280280
{
281-
PartitioningHandle partitioning = metadata.getLayout(session, node.getTable())
281+
PartitioningHandle partitioning = metadata.getTableProperties(session, node.getTable())
282282
.getTablePartitioning()
283283
.map(TablePartitioning::getPartitioningHandle)
284284
.orElse(SOURCE_DISTRIBUTION);
@@ -643,7 +643,7 @@ private GroupedExecutionProperties processWindowFunction(PlanNode node)
643643
@Override
644644
public GroupedExecutionProperties visitTableScan(TableScanNode node, Void context)
645645
{
646-
Optional<TablePartitioning> tablePartitioning = metadata.getLayout(session, node.getTable()).getTablePartitioning();
646+
Optional<TablePartitioning> tablePartitioning = metadata.getTableProperties(session, node.getTable()).getTablePartitioning();
647647
if (!tablePartitioning.isPresent()) {
648648
return GroupedExecutionProperties.notCapable();
649649
}
@@ -748,7 +748,7 @@ public PartitioningHandleReassigner(PartitioningHandle fragmentPartitioningHandl
748748
@Override
749749
public PlanNode visitTableScan(TableScanNode node, RewriteContext<Void> context)
750750
{
751-
PartitioningHandle partitioning = metadata.getLayout(session, node.getTable())
751+
PartitioningHandle partitioning = metadata.getTableProperties(session, node.getTable())
752752
.getTablePartitioning()
753753
.map(TablePartitioning::getPartitioningHandle)
754754
.orElse(SOURCE_DISTRIBUTION);

presto-main/src/main/java/io/prestosql/sql/planner/iterative/rule/PushPredicateIntoTableScan.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public Result apply(FilterNode filterNode, Captures captures, Context context)
102102
{
103103
TableScanNode tableScan = captures.get(TABLE_SCAN);
104104

105-
PlanNode rewritten = pushFilterIntoTableScan(
105+
Optional<PlanNode> rewritten = pushFilterIntoTableScan(
106106
tableScan,
107107
filterNode.getPredicate(),
108108
false,
@@ -113,11 +113,11 @@ public Result apply(FilterNode filterNode, Captures captures, Context context)
113113
typeAnalyzer,
114114
domainTranslator);
115115

116-
if (arePlansSame(filterNode, tableScan, rewritten)) {
116+
if (!rewritten.isPresent() || arePlansSame(filterNode, tableScan, rewritten.get())) {
117117
return Result.empty();
118118
}
119119

120-
return Result.ofPlanNode(rewritten);
120+
return Result.ofPlanNode(rewritten.get());
121121
}
122122

123123
private boolean arePlansSame(FilterNode filter, TableScanNode tableScan, PlanNode rewritten)
@@ -141,7 +141,7 @@ private boolean arePlansSame(FilterNode filter, TableScanNode tableScan, PlanNod
141141
&& Objects.equals(tableScan.getEnforcedConstraint(), rewrittenTableScan.getEnforcedConstraint());
142142
}
143143

144-
public static PlanNode pushFilterIntoTableScan(
144+
public static Optional<PlanNode> pushFilterIntoTableScan(
145145
TableScanNode node,
146146
Expression predicate,
147147
boolean pruneWithPredicateExpression,
@@ -152,6 +152,10 @@ public static PlanNode pushFilterIntoTableScan(
152152
TypeAnalyzer typeAnalyzer,
153153
DomainTranslator domainTranslator)
154154
{
155+
if (!metadata.usesLegacyTableLayouts(session, node.getTable())) {
156+
return Optional.empty();
157+
}
158+
155159
// don't include non-deterministic predicates
156160
Expression deterministicPredicate = filterDeterministicConjuncts(predicate);
157161

@@ -196,16 +200,16 @@ public static PlanNode pushFilterIntoTableScan(
196200
.map(node.getAssignments()::get)
197201
.collect(toImmutableSet())));
198202

199-
if (!layout.isPresent() || layout.get().getLayout().getPredicate().isNone()) {
200-
return new ValuesNode(idAllocator.getNextId(), node.getOutputSymbols(), ImmutableList.of());
203+
if (!layout.isPresent() || layout.get().getTableProperties().getPredicate().isNone()) {
204+
return Optional.of(new ValuesNode(idAllocator.getNextId(), node.getOutputSymbols(), ImmutableList.of()));
201205
}
202206

203207
TableScanNode tableScan = new TableScanNode(
204208
node.getId(),
205209
layout.get().getNewTableHandle(),
206210
node.getOutputSymbols(),
207211
node.getAssignments(),
208-
layout.get().getLayout().getPredicate(),
212+
layout.get().getTableProperties().getPredicate(),
209213
computeEnforced(newDomain, layout.get().getUnenforcedConstraint()));
210214

211215
// The order of the arguments to combineConjuncts matters:
@@ -222,10 +226,10 @@ public static PlanNode pushFilterIntoTableScan(
222226
decomposedPredicate.getRemainingExpression());
223227

224228
if (!TRUE_LITERAL.equals(resultingPredicate)) {
225-
return new FilterNode(idAllocator.getNextId(), tableScan, resultingPredicate);
229+
return Optional.of(new FilterNode(idAllocator.getNextId(), tableScan, resultingPredicate));
226230
}
227231

228-
return tableScan;
232+
return Optional.of(tableScan);
229233
}
230234

231235
private static class LayoutConstraintEvaluator

0 commit comments

Comments
 (0)