This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-19460
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit da3bb2a6decfef6220a8206a2d43b88fe6cceef6
Author: amashenkov <andrey.mashen...@gmail.com>
AuthorDate: Thu May 18 12:37:38 2023 +0300

    Add create/drop index events.
---
 .../internal/catalog/CatalogServiceImpl.java       | 14 +++-
 .../internal/catalog/events/CatalogEvent.java      |  8 ++-
 .../internal/catalog/CatalogServiceSelfTest.java   | 80 +++++++++++++++++++---
 3 files changed, 91 insertions(+), 11 deletions(-)

diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
index 5a780ec72a..7bd2965cbf 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogServiceImpl.java
@@ -41,7 +41,9 @@ import 
org.apache.ignite.internal.catalog.descriptors.SchemaDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.TableDescriptor;
 import org.apache.ignite.internal.catalog.events.CatalogEvent;
 import org.apache.ignite.internal.catalog.events.CatalogEventParameters;
+import org.apache.ignite.internal.catalog.events.CreateIndexEventParameters;
 import org.apache.ignite.internal.catalog.events.CreateTableEventParameters;
+import org.apache.ignite.internal.catalog.events.DropIndexEventParameters;
 import org.apache.ignite.internal.catalog.events.DropTableEventParameters;
 import org.apache.ignite.internal.catalog.storage.DropIndexEntry;
 import org.apache.ignite.internal.catalog.storage.DropTableEntry;
@@ -125,7 +127,7 @@ public class CatalogServiceImpl extends 
Producer<CatalogEvent, CatalogEventParam
     /** {@inheritDoc} */
     @Override
     public IndexDescriptor index(String indexName, long timestamp) {
-        return catalogAt(timestamp).schema(PUBLIC).index(indexName);
+        return 
catalogAt(timestamp).schema(CatalogService.PUBLIC).index(indexName);
     }
 
     /** {@inheritDoc} */
@@ -379,6 +381,11 @@ public class CatalogServiceImpl extends 
Producer<CatalogEvent, CatalogEventParam
                                     ArrayUtils.concat(schema.indexes(), 
((NewIndexEntry) entry).descriptor())
                             )
                     );
+
+                    eventFutures.add(fireEvent(
+                            CatalogEvent.INDEX_CREATE,
+                            new CreateIndexEventParameters(version, 
((NewIndexEntry) entry).descriptor())
+                    ));
                 } else if (entry instanceof DropIndexEntry) {
                     int indexId = ((DropIndexEntry) entry).indexId();
 
@@ -394,6 +401,11 @@ public class CatalogServiceImpl extends 
Producer<CatalogEvent, CatalogEventParam
                                     Arrays.stream(schema.indexes()).filter(t 
-> t.id() != indexId).toArray(IndexDescriptor[]::new)
                             )
                     );
+
+                    eventFutures.add(fireEvent(
+                            CatalogEvent.INDEX_DROP,
+                            new DropIndexEventParameters(version, indexId)
+                    ));
                 } else if (entry instanceof ObjectIdGenUpdateEntry) {
                     catalog = new Catalog(
                             version,
diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java
index d88347aeca..dfae89507b 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/events/CatalogEvent.java
@@ -27,5 +27,11 @@ public enum CatalogEvent implements Event {
     TABLE_CREATE,
 
     /** This event is fired, when a table was dropped in Catalog. */
-    TABLE_DROP
+    TABLE_DROP,
+
+    /** This event is fired, when a index was created in Catalog. */
+    INDEX_CREATE,
+
+    /** This event is fired, when a index was dropped in Catalog. */
+    INDEX_DROP
 }
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
index a108bd4e6b..a152c6abb0 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogServiceSelfTest.java
@@ -34,6 +34,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
@@ -44,6 +45,7 @@ import 
org.apache.ignite.internal.catalog.commands.CreateIndexParams;
 import org.apache.ignite.internal.catalog.commands.CreateIndexParams.Type;
 import org.apache.ignite.internal.catalog.commands.CreateTableParams;
 import org.apache.ignite.internal.catalog.commands.DefaultValue;
+import org.apache.ignite.internal.catalog.commands.DropIndexParams;
 import org.apache.ignite.internal.catalog.commands.DropTableParams;
 import org.apache.ignite.internal.catalog.descriptors.ColumnCollation;
 import org.apache.ignite.internal.catalog.descriptors.HashIndexDescriptor;
@@ -52,7 +54,9 @@ import 
org.apache.ignite.internal.catalog.descriptors.SortedIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.TableDescriptor;
 import org.apache.ignite.internal.catalog.events.CatalogEvent;
 import org.apache.ignite.internal.catalog.events.CatalogEventParameters;
+import org.apache.ignite.internal.catalog.events.CreateIndexEventParameters;
 import org.apache.ignite.internal.catalog.events.CreateTableEventParameters;
+import org.apache.ignite.internal.catalog.events.DropIndexEventParameters;
 import org.apache.ignite.internal.catalog.events.DropTableEventParameters;
 import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
 import org.apache.ignite.internal.catalog.storage.UpdateLog;
@@ -67,6 +71,7 @@ import org.apache.ignite.internal.vault.VaultManager;
 import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.apache.ignite.lang.IndexAlreadyExistsException;
+import org.apache.ignite.lang.IndexNotFoundException;
 import org.apache.ignite.lang.NodeStoppingException;
 import org.apache.ignite.lang.TableAlreadyExistsException;
 import org.apache.ignite.lang.TableNotFoundException;
@@ -243,12 +248,14 @@ public class CatalogServiceSelfTest {
     }
 
     @Test
-    public void testDropTable() {
+    public void testDropTable() throws InterruptedException {
         assertThat(service.createTable(simpleTable(TABLE_NAME)), 
willBe((Object) null));
         assertThat(service.createTable(simpleTable(TABLE_NAME_2)), 
willBe((Object) null));
 
         long beforeDropTimestamp = System.currentTimeMillis();
 
+        Thread.sleep(5);
+
         DropTableParams dropTableParams = 
DropTableParams.builder().schemaName("PUBLIC").tableName(TABLE_NAME).build();
 
         assertThat(service.dropTable(dropTableParams), willBe((Object) null));
@@ -477,8 +484,8 @@ public class CatalogServiceSelfTest {
 
     @Test
     public void testCreateTableEvents() {
-        CreateTableParams params = CreateTableParams.builder()
-                .schemaName("PUBLIC")
+        CreateTableParams createTableParams = CreateTableParams.builder()
+                .schemaName(CatalogService.PUBLIC)
                 .tableName(TABLE_NAME)
                 .ifTableExists(true)
                 .zone("ZONE")
@@ -491,25 +498,80 @@ public class CatalogServiceSelfTest {
                 .colocationColumns(List.of("key2"))
                 .build();
 
+        DropTableParams dropTableparams = 
DropTableParams.builder().tableName(TABLE_NAME).build();
+
         EventListener<CatalogEventParameters> eventListener = 
Mockito.mock(EventListener.class);
         when(eventListener.notify(any(), 
any())).thenReturn(completedFuture(false));
 
         service.listen(CatalogEvent.TABLE_CREATE, eventListener);
         service.listen(CatalogEvent.TABLE_DROP, eventListener);
 
-        CompletableFuture<Void> fut = service.createTable(params);
+        assertThat(service.createTable(createTableParams), willBe((Object) 
null));
+        verify(eventListener).notify(any(CreateTableEventParameters.class), 
ArgumentMatchers.isNull());
 
-        assertThat(fut, willBe((Object) null));
+        assertThat(service.dropTable(dropTableparams), willBe((Object) null));
+        verify(eventListener).notify(any(DropTableEventParameters.class), 
ArgumentMatchers.isNull());
 
-        verify(eventListener).notify(any(CreateTableEventParameters.class), 
ArgumentMatchers.isNull());
+        verifyNoMoreInteractions(eventListener);
+    }
+
+    @Test
+    public void testCreateIndexEvents() {
+        CreateTableParams createTableParams = CreateTableParams.builder()
+                .schemaName(CatalogService.PUBLIC)
+                .tableName(TABLE_NAME)
+                .ifTableExists(true)
+                .zone("ZONE")
+                .columns(List.of(
+                        new ColumnParams("key1", ColumnType.INT32, 
DefaultValue.constant(null), false),
+                        new ColumnParams("key2", ColumnType.INT32, 
DefaultValue.constant(null), false),
+                        new ColumnParams("val", ColumnType.INT32, 
DefaultValue.constant(null), true)
+                ))
+                .primaryKeyColumns(List.of("key1", "key2"))
+                .colocationColumns(List.of("key2"))
+                .build();
 
         DropTableParams dropTableparams = 
DropTableParams.builder().tableName(TABLE_NAME).build();
 
-        fut = service.dropTable(dropTableparams);
+        CreateIndexParams createIndexParams = CreateIndexParams.builder()
+                .schemaName(CatalogService.PUBLIC)
+                .indexName(INDEX_NAME)
+                .tableName(TABLE_NAME)
+                .ifIndexExists(true)
+                .type(Type.HASH)
+                .unique()
+                .columns(List.of("key2"))
+                .build();
 
-        assertThat(fut, willBe((Object) null));
+        DropIndexParams dropIndexParams = 
DropIndexParams.builder().indexName(INDEX_NAME).build();
+
+        EventListener<CatalogEventParameters> eventListener = 
Mockito.mock(EventListener.class);
+        when(eventListener.notify(any(), 
any())).thenReturn(completedFuture(false));
+
+        service.listen(CatalogEvent.INDEX_CREATE, eventListener);
+        service.listen(CatalogEvent.INDEX_DROP, eventListener);
+
+        // Try to create index without table.
+        assertThat(service.createIndex(createIndexParams), 
willThrow(TableNotFoundException.class));
+        verifyNoInteractions(eventListener);
+
+        // Create table.
+        assertThat(service.createTable(createTableParams), willBe((Object) 
null));
+
+        // Create index.
+        assertThat(service.createIndex(createIndexParams), willBe((Object) 
null));
+        verify(eventListener).notify(any(CreateIndexEventParameters.class), 
ArgumentMatchers.isNull());
+
+        // Drop index.
+        assertThat(service.dropIndex(dropIndexParams), willBe((Object) null));
+        verify(eventListener).notify(any(DropIndexEventParameters.class), 
ArgumentMatchers.isNull());
+
+        // Drop table.
+        assertThat(service.dropTable(dropTableparams), willBe((Object) null));
+
+        // Try drop index once again.
+        assertThat(service.dropIndex(dropIndexParams), 
willThrow(IndexNotFoundException.class));
 
-        verify(eventListener).notify(any(DropTableEventParameters.class), 
ArgumentMatchers.isNull());
         verifyNoMoreInteractions(eventListener);
     }
 

Reply via email to