From c14f46fbd26281eb060529db843672cc77068748 Mon Sep 17 00:00:00 2001 From: Tglman Date: Fri, 21 Jul 2023 16:37:49 +0100 Subject: [PATCH] fix: make sure to reload correctly view index informations on context restart --- .../orient/core/db/OrientDBEmbedded.java | 1 + .../core/metadata/schema/OViewImpl.java | 2 +- .../core/metadata/schema/OViewTest.java | 90 ++++++++++++++----- 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/com/orientechnologies/orient/core/db/OrientDBEmbedded.java b/core/src/main/java/com/orientechnologies/orient/core/db/OrientDBEmbedded.java index 6dda706f674..1e1d7d27bbe 100755 --- a/core/src/main/java/com/orientechnologies/orient/core/db/OrientDBEmbedded.java +++ b/core/src/main/java/com/orientechnologies/orient/core/db/OrientDBEmbedded.java @@ -1165,6 +1165,7 @@ public synchronized void forceDatabaseClose(String iDatabaseName) { OAbstractPaginatedStorage storage = storages.remove(iDatabaseName); if (storage != null) { OSharedContext ctx = sharedContexts.remove(iDatabaseName); + ctx.getViewManager().close(); if (ctx != null) { ctx.close(); } diff --git a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OViewImpl.java b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OViewImpl.java index ce796f85aa0..8ae31aa1626 100644 --- a/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OViewImpl.java +++ b/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OViewImpl.java @@ -39,7 +39,7 @@ public void fromStream() { this.cfg = new OViewConfig(getName(), query); this.cfg.setUpdatable(Boolean.TRUE.equals(document.getProperty("updatable"))); - if (document.getProperty("indexes") instanceof Map) { + if (document.getProperty("indexes") instanceof List) { List> idxData = document.getProperty("indexes"); for (Map idx : idxData) { String type = (String) idx.get("type"); diff --git a/core/src/test/java/com/orientechnologies/orient/core/metadata/schema/OViewTest.java b/core/src/test/java/com/orientechnologies/orient/core/metadata/schema/OViewTest.java index 0804f091aa3..c6d0cf3fbb7 100644 --- a/core/src/test/java/com/orientechnologies/orient/core/metadata/schema/OViewTest.java +++ b/core/src/test/java/com/orientechnologies/orient/core/metadata/schema/OViewTest.java @@ -1,8 +1,13 @@ package com.orientechnologies.orient.core.metadata.schema; +import static org.junit.Assert.assertTrue; + import com.orientechnologies.orient.core.db.ODatabaseSession; -import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; +import com.orientechnologies.orient.core.db.OrientDB; +import com.orientechnologies.orient.core.db.OrientDBConfig; +import com.orientechnologies.orient.core.db.OrientDBInternal; import com.orientechnologies.orient.core.db.viewmanager.ViewCreationListener; +import com.orientechnologies.orient.core.sql.executor.OResultSet; import java.util.concurrent.CountDownLatch; import org.junit.After; import org.junit.Assert; @@ -11,39 +16,78 @@ public class OViewTest { - private ODatabaseDocumentTx db; + private OrientDB orientdb; @Before public void setUp() { - db = new ODatabaseDocumentTx("memory:" + OViewTest.class.getSimpleName()); - db.create(); + orientdb = new OrientDB("embedded:./target/views", OrientDBConfig.defaultConfig()); } @After public void after() { - db.drop(); + if (orientdb.exists("view_close")) { + orientdb.drop("view_close"); + } + orientdb.close(); } @Test public void testSimple() throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); - db.getMetadata() - .getSchema() - .createView( - new OViewConfig("testSimple", "SELECT FROM V"), - new ViewCreationListener() { - @Override - public void afterCreate(ODatabaseSession database, String viewName) { - latch.countDown(); - } - - @Override - public void onError(String viewName, Exception exception) {} - }); - latch.await(); - - Assert.assertNotNull(db.getMetadata().getSchema().getView("testSimple")); - Assert.assertNull(db.getMetadata().getSchema().getClass("testSimple")); - Assert.assertNull(db.getMetadata().getSchema().getView("V")); + orientdb.execute( + "create database " + + OViewTest.class.getSimpleName() + + " memory users (admin identified by 'adminpwd' role admin)"); + try (ODatabaseSession db = + orientdb.open(OViewTest.class.getSimpleName(), "admin", "adminpwd")) { + + db.getMetadata() + .getSchema() + .createView( + new OViewConfig("testSimple", "SELECT FROM V"), + new ViewCreationListener() { + @Override + public void afterCreate(ODatabaseSession database, String viewName) { + latch.countDown(); + } + + @Override + public void onError(String viewName, Exception exception) {} + }); + latch.await(); + + Assert.assertNotNull(db.getMetadata().getSchema().getView("testSimple")); + Assert.assertNull(db.getMetadata().getSchema().getClass("testSimple")); + Assert.assertNull(db.getMetadata().getSchema().getView("V")); + } + } + + @Test + public void testCloseDatabase() throws InterruptedException { + orientdb.execute( + "create database view_close plocal users (admin identified by 'adminpwd' role admin)"); + try (ODatabaseSession session = orientdb.open("view_close", "admin", "adminpwd")) { + session.createClass("test"); + session + .command( + "create view test_view from( select name from test ) metadata {updateIntervalSeconds:1, indexes: [{type:'NOTUNIQUE', properties:{name:'STRING'}}]}") + .close(); + session.command("insert into test set name='abc'").close(); + + Thread.sleep(2000); + try (OResultSet result = session.query("select from test_view where name='abc'")) { + String execution = result.getExecutionPlan().get().prettyPrint(0, 0); + assertTrue(execution.contains("FETCH FROM INDEX")); + } + } + + OrientDBInternal.extract(orientdb).forceDatabaseClose("view_close"); + try (ODatabaseSession session = orientdb.open("view_close", "admin", "adminpwd")) { + Thread.sleep(2000); + try (OResultSet result = session.query("select from test_view where name='abc'")) { + String execution = result.getExecutionPlan().get().prettyPrint(0, 0); + assertTrue(execution.contains("FETCH FROM INDEX")); + } + } } }