1515
1616import com .facebook .airlift .json .JsonCodec ;
1717import com .facebook .airlift .log .Logger ;
18+ import com .facebook .presto .common .QualifiedObjectName ;
1819import com .facebook .presto .common .RuntimeStats ;
1920import com .facebook .presto .common .Subfield ;
2021import com .facebook .presto .common .predicate .TupleDomain ;
3536import com .facebook .presto .spi .ColumnHandle ;
3637import com .facebook .presto .spi .ColumnMetadata ;
3738import com .facebook .presto .spi .ConnectorDeleteTableHandle ;
39+ import com .facebook .presto .spi .ConnectorDistributedProcedureHandle ;
40+ import com .facebook .presto .spi .ConnectorId ;
3841import com .facebook .presto .spi .ConnectorInsertTableHandle ;
3942import com .facebook .presto .spi .ConnectorNewTableLayout ;
4043import com .facebook .presto .spi .ConnectorOutputTableHandle ;
4144import com .facebook .presto .spi .ConnectorSession ;
45+ import com .facebook .presto .spi .ConnectorSplitSource ;
4246import com .facebook .presto .spi .ConnectorTableHandle ;
4347import com .facebook .presto .spi .ConnectorTableLayout ;
4448import com .facebook .presto .spi .ConnectorTableLayoutHandle ;
5963import com .facebook .presto .spi .connector .ConnectorTableVersion .VersionType ;
6064import com .facebook .presto .spi .function .StandardFunctionResolution ;
6165import com .facebook .presto .spi .plan .FilterStatsCalculatorService ;
66+ import com .facebook .presto .spi .procedure .DistributedProcedure ;
67+ import com .facebook .presto .spi .procedure .Procedure ;
68+ import com .facebook .presto .spi .procedure .ProcedureRegistry ;
6269import com .facebook .presto .spi .relation .RowExpression ;
6370import com .facebook .presto .spi .relation .RowExpressionService ;
6471import com .facebook .presto .spi .statistics .ColumnStatisticMetadata ;
@@ -219,10 +226,12 @@ public abstract class IcebergAbstractMetadata
219226 protected static final String INFORMATION_SCHEMA = "information_schema" ;
220227
221228 protected final TypeManager typeManager ;
229+ protected final ProcedureRegistry procedureRegistry ;
222230 protected final JsonCodec <CommitTaskData > commitTaskCodec ;
223231 protected final NodeVersion nodeVersion ;
224232 protected final RowExpressionService rowExpressionService ;
225233 protected final FilterStatsCalculatorService filterStatsCalculatorService ;
234+ protected Optional <IcebergProcedureContext > procedureContext = Optional .empty ();
226235 protected Transaction transaction ;
227236 protected final StatisticsFileCache statisticsFileCache ;
228237 protected final IcebergTableProperties tableProperties ;
@@ -232,6 +241,7 @@ public abstract class IcebergAbstractMetadata
232241
233242 public IcebergAbstractMetadata (
234243 TypeManager typeManager ,
244+ ProcedureRegistry procedureRegistry ,
235245 StandardFunctionResolution functionResolution ,
236246 RowExpressionService rowExpressionService ,
237247 JsonCodec <CommitTaskData > commitTaskCodec ,
@@ -241,6 +251,7 @@ public IcebergAbstractMetadata(
241251 IcebergTableProperties tableProperties )
242252 {
243253 this .typeManager = requireNonNull (typeManager , "typeManager is null" );
254+ this .procedureRegistry = requireNonNull (procedureRegistry , "procedureRegistry is null" );
244255 this .commitTaskCodec = requireNonNull (commitTaskCodec , "commitTaskCodec is null" );
245256 this .functionResolution = requireNonNull (functionResolution , "functionResolution is null" );
246257 this .rowExpressionService = requireNonNull (rowExpressionService , "rowExpressionService is null" );
@@ -267,6 +278,11 @@ protected final Table getIcebergTable(ConnectorSession session, SchemaTableName
267278
268279 public abstract void unregisterTable (ConnectorSession clientSession , SchemaTableName schemaTableName );
269280
281+ public Optional <ConnectorSplitSource > getSplitSourceInCurrentCallProcedureTransaction ()
282+ {
283+ return procedureContext .flatMap (IcebergProcedureContext ::getConnectorSplitSource );
284+ }
285+
270286 /**
271287 * This class implements the default implementation for getTableLayoutForConstraint which will be used in the case of a Java Worker
272288 */
@@ -1041,6 +1057,48 @@ public void truncateTable(ConnectorSession session, ConnectorTableHandle tableHa
10411057 removeScanFiles (icebergTable , TupleDomain .all ());
10421058 }
10431059
1060+ @ Override
1061+ public ConnectorDistributedProcedureHandle beginCallDistributedProcedure (
1062+ ConnectorSession session ,
1063+ QualifiedObjectName procedureName ,
1064+ ConnectorTableLayoutHandle tableLayoutHandle ,
1065+ Object [] arguments )
1066+ {
1067+ IcebergTableHandle handle = ((IcebergTableLayoutHandle ) tableLayoutHandle ).getTable ();
1068+ Table icebergTable = getIcebergTable (session , handle .getSchemaTableName ());
1069+
1070+ if (handle .isSnapshotSpecified ()) {
1071+ throw new PrestoException (NOT_SUPPORTED , "This connector do not allow table execute at specified snapshot" );
1072+ }
1073+
1074+ transaction = icebergTable .newTransaction ();
1075+ Procedure procedure = procedureRegistry .resolve (
1076+ new ConnectorId (procedureName .getCatalogName ()),
1077+ new SchemaTableName (
1078+ procedureName .getSchemaName (),
1079+ procedureName .getObjectName ()));
1080+ verify (procedure instanceof DistributedProcedure , "procedure must be DistributedProcedure" );
1081+ procedureContext = Optional .of ((IcebergProcedureContext ) ((DistributedProcedure ) procedure ).createContext ());
1082+ procedureContext .get ().setTable (icebergTable );
1083+ procedureContext .get ().setTransaction (transaction );
1084+ return ((DistributedProcedure ) procedure ).begin (session , procedureContext .get (), tableLayoutHandle , arguments );
1085+ }
1086+
1087+ @ Override
1088+ public void finishCallDistributedProcedure (ConnectorSession session , ConnectorDistributedProcedureHandle procedureHandle , QualifiedObjectName procedureName , Collection <Slice > fragments )
1089+ {
1090+ Procedure procedure = procedureRegistry .resolve (
1091+ new ConnectorId (procedureName .getCatalogName ()),
1092+ new SchemaTableName (
1093+ procedureName .getSchemaName (),
1094+ procedureName .getObjectName ()));
1095+ verify (procedure instanceof DistributedProcedure , "procedure must be DistributedProcedure" );
1096+ verify (procedureContext .isPresent (), "procedure context must be present" );
1097+ ((DistributedProcedure ) procedure ).finish (procedureContext .get (), procedureHandle , fragments );
1098+ transaction .commitTransaction ();
1099+ procedureContext .get ().destroy ();
1100+ }
1101+
10441102 @ Override
10451103 public ConnectorDeleteTableHandle beginDelete (ConnectorSession session , ConnectorTableHandle tableHandle )
10461104 {
0 commit comments