11package com .redis .trino ;
22
3+ import static com .google .common .base .Preconditions .checkState ;
4+ import static com .google .common .collect .ImmutableList .toImmutableList ;
35import static java .lang .Math .toIntExact ;
46import static java .util .Objects .requireNonNull ;
57import static java .util .stream .Collectors .toList ;
68
9+ import java .util .Collection ;
710import java .util .List ;
811import java .util .Map ;
912import java .util .Optional ;
1013import java .util .OptionalInt ;
14+ import java .util .concurrent .atomic .AtomicReference ;
1115
1216import com .google .common .collect .ImmutableList ;
1317import com .google .common .collect .ImmutableMap ;
1418
19+ import io .airlift .slice .Slice ;
1520import io .trino .spi .connector .ColumnHandle ;
1621import io .trino .spi .connector .ColumnMetadata ;
22+ import io .trino .spi .connector .ConnectorInsertTableHandle ;
1723import io .trino .spi .connector .ConnectorMetadata ;
24+ import io .trino .spi .connector .ConnectorOutputMetadata ;
25+ import io .trino .spi .connector .ConnectorOutputTableHandle ;
1826import io .trino .spi .connector .ConnectorSession ;
1927import io .trino .spi .connector .ConnectorTableHandle ;
28+ import io .trino .spi .connector .ConnectorTableLayout ;
2029import io .trino .spi .connector .ConnectorTableMetadata ;
2130import io .trino .spi .connector .ConnectorTableProperties ;
2231import io .trino .spi .connector .Constraint ;
2736import io .trino .spi .connector .SchemaTablePrefix ;
2837import io .trino .spi .connector .TableNotFoundException ;
2938import io .trino .spi .predicate .TupleDomain ;
39+ import io .trino .spi .statistics .ComputedStatistics ;
3040
3141public class RediSearchMetadata implements ConnectorMetadata {
3242
3343 private final RediSearchSession rediSearchSession ;
34- // private final AtomicReference<Runnable> rollbackAction = new AtomicReference<>();
3544 private final String schemaName ;
45+ private final AtomicReference <Runnable > rollbackAction = new AtomicReference <>();
3646
3747 public RediSearchMetadata (RediSearchSession rediSearchSession ) {
3848 this .rediSearchSession = requireNonNull (rediSearchSession , "rediSearchSession is null" );
@@ -114,61 +124,69 @@ public ColumnMetadata getColumnMetadata(ConnectorSession session, ConnectorTable
114124 return ((RediSearchColumnHandle ) columnHandle ).toColumnMetadata ();
115125 }
116126
117- // @Override
118- // public void createTable(ConnectorSession session, ConnectorTableMetadata tableMetadata, boolean ignoreExisting) {
119- // rediSearchSession.createTable(tableMetadata.getTable(), buildColumnHandles(tableMetadata));
120- // }
121- //
122- // @Override
123- // public void dropTable(ConnectorSession session, ConnectorTableHandle tableHandle) {
124- // RediSearchTableHandle table = (RediSearchTableHandle) tableHandle;
125- //
126- // rediSearchSession.dropTable(table.getSchemaTableName());
127- // }
128- //
129- // @Override
130- // public ConnectorOutputTableHandle beginCreateTable(ConnectorSession session, ConnectorTableMetadata tableMetadata,
131- // Optional<ConnectorNewTableLayout> layout) {
132- // List<RediSearchColumnHandle> columns = buildColumnHandles(tableMetadata);
133- //
134- // rediSearchSession.createTable(tableMetadata.getTable(), columns);
135- //
136- // setRollback(() -> rediSearchSession.dropTable(tableMetadata.getTable()));
137- //
138- // return new RediSearchOutputTableHandle(tableMetadata.getTable(),
139- // columns.stream().filter(c -> !c.isHidden()).collect(toList()));
140- // }
141-
142- // @Override
143- // public Optional<ConnectorOutputMetadata> finishCreateTable(ConnectorSession session,
144- // ConnectorOutputTableHandle tableHandle, Collection<Slice> fragments,
145- // Collection<ComputedStatistics> computedStatistics) {
146- // clearRollback();
147- // return Optional.empty();
148- // }
149-
150- // @Override
151- // public ConnectorInsertTableHandle beginInsert(ConnectorSession session, ConnectorTableHandle tableHandle) {
152- // RediSearchTableHandle table = (RediSearchTableHandle) tableHandle;
153- // List<RediSearchColumnHandle> columns = rediSearchSession.getTable(table.getSchemaTableName()).getColumns();
154- //
155- // return new RediSearchInsertTableHandle(table.getSchemaTableName(),
156- // columns.stream().filter(column -> !column.isHidden())
157- // .peek(column -> validateColumnNameForInsert(column.getName())).collect(toImmutableList()));
158- // }
159- //
160- // @Override
161- // public Optional<ConnectorOutputMetadata> finishInsert(ConnectorSession session,
162- // ConnectorInsertTableHandle insertHandle, Collection<Slice> fragments,
163- // Collection<ComputedStatistics> computedStatistics) {
164- // return Optional.empty();
165- // }
127+ @ Override
128+ public void createTable (ConnectorSession session , ConnectorTableMetadata tableMetadata , boolean ignoreExisting ) {
129+ rediSearchSession .createTable (tableMetadata .getTable (), buildColumnHandles (tableMetadata ));
130+ }
166131
167132 @ Override
168- public ConnectorTableProperties getTableProperties (ConnectorSession session , ConnectorTableHandle table ) {
169- RediSearchTableHandle tableHandle = (RediSearchTableHandle ) table ;
133+ public void dropTable (ConnectorSession session , ConnectorTableHandle tableHandle ) {
134+ RediSearchTableHandle table = (RediSearchTableHandle ) tableHandle ;
135+ rediSearchSession .dropTable (table .getSchemaTableName ());
136+ }
137+
138+ @ Override
139+ public void addColumn (ConnectorSession session , ConnectorTableHandle tableHandle , ColumnMetadata column ) {
140+ rediSearchSession .addColumn (((RediSearchTableHandle ) tableHandle ).getSchemaTableName (), column );
141+ }
142+
143+ @ Override
144+ public void dropColumn (ConnectorSession session , ConnectorTableHandle tableHandle , ColumnHandle column ) {
145+ rediSearchSession .dropColumn (((RediSearchTableHandle ) tableHandle ).getSchemaTableName (),
146+ ((RediSearchColumnHandle ) column ).getName ());
147+ }
148+
149+ @ Override
150+ public ConnectorOutputTableHandle beginCreateTable (ConnectorSession session , ConnectorTableMetadata tableMetadata ,
151+ Optional <ConnectorTableLayout > layout ) {
152+ List <RediSearchColumnHandle > columns = buildColumnHandles (tableMetadata );
153+
154+ rediSearchSession .createTable (tableMetadata .getTable (), columns );
155+
156+ setRollback (() -> rediSearchSession .dropTable (tableMetadata .getTable ()));
157+
158+ return new RediSearchOutputTableHandle (tableMetadata .getTable (),
159+ columns .stream ().filter (c -> !c .isHidden ()).collect (toList ()));
160+ }
161+
162+ @ Override
163+ public Optional <ConnectorOutputMetadata > finishCreateTable (ConnectorSession session ,
164+ ConnectorOutputTableHandle tableHandle , Collection <Slice > fragments ,
165+ Collection <ComputedStatistics > computedStatistics ) {
166+ clearRollback ();
167+ return Optional .empty ();
168+ }
169+
170+ @ Override
171+ public ConnectorInsertTableHandle beginInsert (ConnectorSession session , ConnectorTableHandle tableHandle ) {
172+ RediSearchTableHandle table = (RediSearchTableHandle ) tableHandle ;
173+ List <RediSearchColumnHandle > columns = rediSearchSession .getTable (table .getSchemaTableName ()).getColumns ();
174+
175+ return new RediSearchInsertTableHandle (table .getSchemaTableName (),
176+ columns .stream ().filter (column -> !column .isHidden ()).collect (toImmutableList ()));
177+ }
178+
179+ @ Override
180+ public Optional <ConnectorOutputMetadata > finishInsert (ConnectorSession session ,
181+ ConnectorInsertTableHandle insertHandle , Collection <Slice > fragments ,
182+ Collection <ComputedStatistics > computedStatistics ) {
183+ return Optional .empty ();
184+ }
170185
171- return new ConnectorTableProperties (tableHandle .getConstraint (), Optional .empty (), Optional .empty (),
186+ @ Override
187+ public ConnectorTableProperties getTableProperties (ConnectorSession session , ConnectorTableHandle table ) {
188+ RediSearchTableHandle handle = (RediSearchTableHandle ) table ;
189+ return new ConnectorTableProperties (handle .getConstraint (), Optional .empty (), Optional .empty (),
172190 Optional .empty (), ImmutableList .of ());
173191 }
174192
@@ -205,17 +223,17 @@ public Optional<ConstraintApplicationResult<ConnectorTableHandle>> applyFilter(C
205223 return Optional .of (new ConstraintApplicationResult <>(handle , constraint .getSummary (), false ));
206224 }
207225
208- // private void setRollback(Runnable action) {
209- // checkState(rollbackAction.compareAndSet(null, action), "rollback action is already set");
210- // }
211- //
212- // private void clearRollback() {
213- // rollbackAction.set(null);
214- // }
226+ private void setRollback (Runnable action ) {
227+ checkState (rollbackAction .compareAndSet (null , action ), "rollback action is already set" );
228+ }
215229
216- // public void rollback() {
217- // Optional.ofNullable(rollbackAction.getAndSet(null)).ifPresent(Runnable::run);
218- // }
230+ private void clearRollback () {
231+ rollbackAction .set (null );
232+ }
233+
234+ public void rollback () {
235+ Optional .ofNullable (rollbackAction .getAndSet (null )).ifPresent (Runnable ::run );
236+ }
219237
220238 private static SchemaTableName getTableName (ConnectorTableHandle tableHandle ) {
221239 return ((RediSearchTableHandle ) tableHandle ).getSchemaTableName ();
@@ -231,14 +249,8 @@ private ConnectorTableMetadata getTableMetadata(ConnectorSession session, Schema
231249 return new ConnectorTableMetadata (tableName , columns );
232250 }
233251
234- // private static List<RediSearchColumnHandle> buildColumnHandles(ConnectorTableMetadata tableMetadata) {
235- // return tableMetadata.getColumns().stream()
236- // .map(m -> new RediSearchColumnHandle(m.getName(), m.getType(), m.isHidden())).collect(toList());
237- // }
238-
239- // private static void validateColumnNameForInsert(String columnName) {
240- // if (columnName.contains("$") || columnName.contains(".")) {
241- // throw new IllegalArgumentException("Column name must not contain '$' or '.' for INSERT: " + columnName);
242- // }
243- // }
252+ private static List <RediSearchColumnHandle > buildColumnHandles (ConnectorTableMetadata tableMetadata ) {
253+ return tableMetadata .getColumns ().stream ()
254+ .map (m -> new RediSearchColumnHandle (m .getName (), m .getType (), m .isHidden ())).collect (toList ());
255+ }
244256}
0 commit comments