From d184c27353a4fd10015b25bb6f777bf3350895f3 Mon Sep 17 00:00:00 2001 From: axgiri <146159445+axgiri@users.noreply.github.com> Date: Sat, 16 May 2026 21:34:44 +0200 Subject: [PATCH 1/6] basic mongodb indexig added --- .../oqm/core/api/scheduled/LifecycleBean.java | 7 ++++- .../scheduled/MongoInitializationHandler.java | 28 +++++++++++++++++++ .../service/mongo/InventoryItemService.java | 8 ++++++ .../api/service/mongo/ItemListService.java | 10 +++++++ .../service/mongo/MongoDbAwareService.java | 14 +++++++++- .../service/mongo/StorageBlockService.java | 8 ++++++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java index 35e6a8979f..d7070a55b2 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java @@ -42,7 +42,10 @@ public class LifecycleBean { @Inject ObjectSchemaUpgradeService objectSchemaUpgradeService; - + + @Inject + MongoInitializationHandler mongoInitializationHandler; + private ZonedDateTime startDateTime; public static void logConfig(){ @@ -145,6 +148,8 @@ void onStart( log.info("Schema upgrade result: {}", schemaUpgradeResult.get()); //TODO:: rescan inv update stats } + // initialize indexes + this.mongoInitializationHandler.initDb(); log.info("Done with initial startup tasks."); } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java new file mode 100644 index 0000000000..4471ef59f7 --- /dev/null +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java @@ -0,0 +1,28 @@ +package tech.ebp.oqm.core.api.scheduled; + +import jakarta.enterprise.inject.Any; +import jakarta.enterprise.inject.Instance; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import tech.ebp.oqm.core.api.service.mongo.MongoDbAwareService; +import tech.ebp.oqm.core.api.service.serviceState.db.DbCacheEntry; +import tech.ebp.oqm.core.api.service.serviceState.db.OqmDatabaseService; + +@Singleton +public class MongoInitializationHandler { + @Inject + OqmDatabaseService oqmDatabaseService; + + @Inject + @Any + Instance> mongoServices; + + void initDb() { + for (DbCacheEntry db : oqmDatabaseService.getDatabases()) { + String dbName = db.getDbName(); + for (MongoDbAwareService service : mongoServices) { + service.initDb(dbName); + } + } + } +} diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java index 937bfbbe28..4b59a192d1 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java @@ -13,6 +13,7 @@ import lombok.Getter; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; import org.bson.types.ObjectId; import org.jetbrains.annotations.NotNull; import tech.ebp.oqm.core.api.config.CoreApiInteractingEntity; @@ -447,4 +448,11 @@ public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpg } } } + + @Override + List getDbIndexes() { + return List.of( + new Document("name", 1) + ); + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java index 729c56f609..71af49cba1 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java @@ -4,6 +4,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.json.JsonObject; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; import org.bson.types.ObjectId; import tech.ebp.oqm.core.api.model.collectionStats.CollectionStats; import tech.ebp.oqm.core.api.model.object.history.events.itemList.ItemListActionAddEvent; @@ -12,6 +13,8 @@ import tech.ebp.oqm.core.api.model.object.itemList.ItemListAction; import tech.ebp.oqm.core.api.model.rest.search.ItemListSearch; +import java.util.List; + @Slf4j @ApplicationScoped public class ItemListService extends MongoHistoriedObjectService { @@ -62,4 +65,11 @@ public ItemList updateAction(String oqmDbIdOrName, ObjectId listId, ObjectId ite public int getCurrentSchemaVersion() { return ItemList.CUR_SCHEMA_VERSION; } + + @Override + public List getDbIndexes() { + return List.of( + new Document("name", 1) + ); + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java index 7e39a7a16d..15814b6541 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java @@ -25,6 +25,7 @@ import tech.ebp.oqm.core.api.service.serviceState.db.OqmDatabaseService; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -172,5 +173,16 @@ protected > X addBaseStats public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpgradeResult upgradeResult) { //nothing to do. - }; + } + + List getDbIndexes() { + return List.of(); + } + + public void initDb(String oqmDbIdOrName) { + List indexes = this.getDbIndexes(); + for(Document index : indexes) { + getDocumentCollection(oqmDbIdOrName).createIndex(index); + } + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java index 0de7046779..74d6305884 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java @@ -5,6 +5,7 @@ import jakarta.inject.Inject; import jakarta.inject.Named; import lombok.extern.slf4j.Slf4j; +import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; import tech.ebp.oqm.core.api.model.collectionStats.CollectionStats; @@ -191,4 +192,11 @@ public Map> getReferencingObjects(String oqmDbIdOrName, Cl public int getCurrentSchemaVersion() { return StorageBlock.CUR_SCHEMA_VERSION; } + + @Override + List getDbIndexes() { + return List.of( + new Document("location", 1) + ); + } } From de3374543bce4970c6575178372f8afd3a34ec6c Mon Sep 17 00:00:00 2001 From: axgiri <146159445+axgiri@users.noreply.github.com> Date: Sun, 17 May 2026 13:57:21 +0200 Subject: [PATCH 2/6] Refactor MongoDB initialization and indexing logic across services --- .../oqm/core/api/scheduled/LifecycleBean.java | 5 - .../oqm/core/api/scheduled/MongoDbInit.java | 94 +++++++++++-------- .../scheduled/MongoInitializationHandler.java | 28 ------ .../service/mongo/InventoryItemService.java | 8 +- .../api/service/mongo/ItemListService.java | 7 +- .../service/mongo/MongoDbAwareService.java | 17 ++-- .../service/mongo/StorageBlockService.java | 6 +- 7 files changed, 76 insertions(+), 89 deletions(-) delete mode 100644 software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java index d7070a55b2..5dcbb2e772 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/LifecycleBean.java @@ -43,9 +43,6 @@ public class LifecycleBean { @Inject ObjectSchemaUpgradeService objectSchemaUpgradeService; - @Inject - MongoInitializationHandler mongoInitializationHandler; - private ZonedDateTime startDateTime; public static void logConfig(){ @@ -148,8 +145,6 @@ void onStart( log.info("Schema upgrade result: {}", schemaUpgradeResult.get()); //TODO:: rescan inv update stats } - // initialize indexes - this.mongoInitializationHandler.initDb(); log.info("Done with initial startup tasks."); } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java index 56f9783fa6..0b4009bc62 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java @@ -2,10 +2,13 @@ import io.quarkus.runtime.StartupEvent; import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.Any; +import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; import jakarta.inject.Singleton; import lombok.extern.slf4j.Slf4j; import tech.ebp.oqm.core.api.service.mongo.InventoryItemService; +import tech.ebp.oqm.core.api.service.mongo.MongoDbAwareService; import tech.ebp.oqm.core.api.service.serviceState.InstanceMutexService; import tech.ebp.oqm.core.api.service.serviceState.db.DbCacheEntry; import tech.ebp.oqm.core.api.service.serviceState.db.OqmDatabaseService; @@ -14,45 +17,54 @@ @Slf4j public class MongoDbInit { - @Inject - InventoryItemService inventoryItemService; - - @Inject - OqmDatabaseService oqmDatabaseService; - - @Inject - InstanceMutexService instanceMutexService; - - - /** - * This was introduced in version 4.4.8 ~ May 15, 2026 - * - * It was intended to ensure that all inventory items created before an upgrade have a mutex registered for them. - * - * This can be removed once all inventory items have mutexes. - */ - private void ensureItemMutexesExist() { - log.info("Ensuring inventory item mutexes exist."); - - for(DbCacheEntry curDb : this.oqmDatabaseService.getDatabases()) { - log.info("Ensuring inventory item mutexes exist for database: {}", curDb.getDbName()); - this.inventoryItemService.iterator(curDb.getDbId().toHexString()).forEachRemaining((item) -> { - this.instanceMutexService.register( - this.instanceMutexService.getMutexIdFor(curDb.getDbId().toHexString(), item) - ); - }); - log.info("DONE Ensuring inventory item mutexes exist for database: {}", curDb.getDbName()); - } - - log.info("DONE Ensuring inventory item mutexes exist."); - } - - - void onStart( - @Observes - StartupEvent ev - ) { - this.ensureItemMutexesExist(); - - } + @Inject + InventoryItemService inventoryItemService; + + @Inject + OqmDatabaseService oqmDatabaseService; + + @Inject + InstanceMutexService instanceMutexService; + + @Inject + @Any + Instance> mongoServices; + + /** + * This was introduced in version 4.4.8 ~ May 15, 2026 + *

+ * It was intended to ensure that all inventory items created before an upgrade have a mutex registered for them. + *

+ * This can be removed once all inventory items have mutexes. + */ + private void ensureItemMutexesExist() { + log.info("Ensuring inventory item mutexes exist."); + + for (DbCacheEntry curDb : this.oqmDatabaseService.getDatabases()) { + log.info("Ensuring inventory item mutexes exist for database: {}", curDb.getDbName()); + this.inventoryItemService.iterator(curDb.getDbId().toHexString()).forEachRemaining((item) -> { + this.instanceMutexService.register( + this.instanceMutexService.getMutexIdFor(curDb.getDbId().toHexString(), item) + ); + }); + log.info("DONE Ensuring inventory item mutexes exist for database: {}", curDb.getDbName()); + } + + log.info("DONE Ensuring inventory item mutexes exist."); + } + + + void onStart( + @Observes + StartupEvent ev + ) { + this.ensureItemMutexesExist(); + this.initDb(); + } + + void initDb() { + for(MongoDbAwareService service : this.mongoServices){ + service.initDb(); + } + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java deleted file mode 100644 index 4471ef59f7..0000000000 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoInitializationHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package tech.ebp.oqm.core.api.scheduled; - -import jakarta.enterprise.inject.Any; -import jakarta.enterprise.inject.Instance; -import jakarta.inject.Inject; -import jakarta.inject.Singleton; -import tech.ebp.oqm.core.api.service.mongo.MongoDbAwareService; -import tech.ebp.oqm.core.api.service.serviceState.db.DbCacheEntry; -import tech.ebp.oqm.core.api.service.serviceState.db.OqmDatabaseService; - -@Singleton -public class MongoInitializationHandler { - @Inject - OqmDatabaseService oqmDatabaseService; - - @Inject - @Any - Instance> mongoServices; - - void initDb() { - for (DbCacheEntry db : oqmDatabaseService.getDatabases()) { - String dbName = db.getDbName(); - for (MongoDbAwareService service : mongoServices) { - service.initDb(dbName); - } - } - } -} diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java index 4b59a192d1..6557972747 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.mongodb.client.ClientSession; import com.mongodb.client.FindIterable; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.Indexes; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -13,7 +15,7 @@ import lombok.Getter; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; -import org.bson.Document; +import org.bson.conversions.Bson; import org.bson.types.ObjectId; import org.jetbrains.annotations.NotNull; import tech.ebp.oqm.core.api.config.CoreApiInteractingEntity; @@ -450,9 +452,9 @@ public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpg } @Override - List getDbIndexes() { + List getDbIndexes() { return List.of( - new Document("name", 1) + Indexes.ascending("name") ); } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java index 71af49cba1..4dc99848e0 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java @@ -1,10 +1,11 @@ package tech.ebp.oqm.core.api.service.mongo; import com.mongodb.client.ClientSession; +import com.mongodb.client.model.Indexes; import jakarta.enterprise.context.ApplicationScoped; import jakarta.json.JsonObject; import lombok.extern.slf4j.Slf4j; -import org.bson.Document; +import org.bson.conversions.Bson; import org.bson.types.ObjectId; import tech.ebp.oqm.core.api.model.collectionStats.CollectionStats; import tech.ebp.oqm.core.api.model.object.history.events.itemList.ItemListActionAddEvent; @@ -67,9 +68,9 @@ public int getCurrentSchemaVersion() { } @Override - public List getDbIndexes() { + public List getDbIndexes() { return List.of( - new Document("name", 1) + Indexes.ascending("name") ); } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java index 15814b6541..32f9f7b287 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java @@ -10,6 +10,7 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.bson.conversions.Bson; import org.bson.types.ObjectId; import tech.ebp.oqm.core.api.model.collectionStats.CollectionStats; import tech.ebp.oqm.core.api.model.object.FileAttachmentContaining; @@ -175,14 +176,18 @@ public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpg //nothing to do. } - List getDbIndexes() { + List getDbIndexes() { return List.of(); } - public void initDb(String oqmDbIdOrName) { - List indexes = this.getDbIndexes(); - for(Document index : indexes) { - getDocumentCollection(oqmDbIdOrName).createIndex(index); - } + public void initDbByIdOrName(String oqmDbIdOrName) { + List indexes = this.getDbIndexes(); + for (Bson index : indexes) { + getDocumentCollection(oqmDbIdOrName).createIndex(index); } + } + + public void initDb(){ + oqmDatabaseService.getDatabases().forEach(db -> this.initDbByIdOrName(db.getDbName())); + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java index 74d6305884..38572021bc 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java @@ -1,11 +1,11 @@ package tech.ebp.oqm.core.api.service.mongo; import com.mongodb.client.ClientSession; +import com.mongodb.client.model.Indexes; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.inject.Named; import lombok.extern.slf4j.Slf4j; -import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; import tech.ebp.oqm.core.api.model.collectionStats.CollectionStats; @@ -194,9 +194,9 @@ public int getCurrentSchemaVersion() { } @Override - List getDbIndexes() { + List getDbIndexes() { return List.of( - new Document("location", 1) + Indexes.ascending("name") ); } } From 4eb6d21b9d9560695a4e85741634227bc005a0e6 Mon Sep 17 00:00:00 2001 From: axgiri <146159445+axgiri@users.noreply.github.com> Date: Sun, 17 May 2026 16:53:13 +0200 Subject: [PATCH 3/6] add unique and background options to mongodb indexes --- .../ebp/oqm/core/api/service/mongo/MongoDbAwareService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java index 32f9f7b287..d7f811477b 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java @@ -4,6 +4,7 @@ import com.mongodb.client.ClientSession; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.IndexOptions; import jakarta.inject.Inject; import jakarta.validation.*; import lombok.Getter; @@ -181,9 +182,10 @@ List getDbIndexes() { } public void initDbByIdOrName(String oqmDbIdOrName) { + IndexOptions options = new IndexOptions().unique(true).background(true); List indexes = this.getDbIndexes(); for (Bson index : indexes) { - getDocumentCollection(oqmDbIdOrName).createIndex(index); + getDocumentCollection(oqmDbIdOrName).createIndex(index, options); } } From 239afdb2ca1ded24e923503520c925b266165d0f Mon Sep 17 00:00:00 2001 From: axgiri <146159445+axgiri@users.noreply.github.com> Date: Sun, 17 May 2026 21:44:40 +0200 Subject: [PATCH 4/6] refactor: add index initialization to TopLevelMongoService and MongoDbAwareService --- .../oqm/core/api/scheduled/MongoDbInit.java | 5 +++-- .../service/mongo/InventoryItemService.java | 3 +-- .../api/service/mongo/MongoDbAwareService.java | 3 ++- .../core/api/service/mongo/MongoService.java | 7 +++++++ .../api/service/mongo/StorageBlockService.java | 2 +- .../service/mongo/TopLevelMongoService.java | 18 +++++++++++++++++- .../serviceState/db/OqmDatabaseService.java | 9 +++++++++ 7 files changed, 40 insertions(+), 7 deletions(-) diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java index 0b4009bc62..2b7511daea 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import tech.ebp.oqm.core.api.service.mongo.InventoryItemService; import tech.ebp.oqm.core.api.service.mongo.MongoDbAwareService; +import tech.ebp.oqm.core.api.service.mongo.MongoService; import tech.ebp.oqm.core.api.service.serviceState.InstanceMutexService; import tech.ebp.oqm.core.api.service.serviceState.db.DbCacheEntry; import tech.ebp.oqm.core.api.service.serviceState.db.OqmDatabaseService; @@ -28,7 +29,7 @@ public class MongoDbInit { @Inject @Any - Instance> mongoServices; + Instance> mongoServices; /** * This was introduced in version 4.4.8 ~ May 15, 2026 @@ -63,7 +64,7 @@ void onStart( } void initDb() { - for(MongoDbAwareService service : this.mongoServices){ + for(MongoService service : this.mongoServices){ service.initDb(); } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java index 6557972747..845face858 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.mongodb.client.ClientSession; import com.mongodb.client.FindIterable; -import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.Indexes; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -452,7 +451,7 @@ public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpg } @Override - List getDbIndexes() { + public List getDbIndexes() { return List.of( Indexes.ascending("name") ); diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java index d7f811477b..1a086c4efc 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java @@ -177,7 +177,8 @@ public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpg //nothing to do. } - List getDbIndexes() { + @Override + public List getDbIndexes() { return List.of(); } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java index 6b2d49aa7d..356a9823f4 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java @@ -14,11 +14,14 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.bson.conversions.Bson; import org.eclipse.microprofile.config.inject.ConfigProperty; import tech.ebp.oqm.core.api.model.collectionStats.CollectionStats; import tech.ebp.oqm.core.api.model.object.MainObject; import tech.ebp.oqm.core.api.model.rest.search.SearchObject; +import java.util.List; + /** * This is the main mongo class. It specifies top level, commonly shared utilities. * @param The type of object this mongo service is dealing with @@ -104,4 +107,8 @@ public MongoService(Class clazz) { } public abstract int getCurrentSchemaVersion(); + + public abstract List getDbIndexes(); + + public abstract void initDb(); } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java index 38572021bc..4f1446e2d7 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java @@ -194,7 +194,7 @@ public int getCurrentSchemaVersion() { } @Override - List getDbIndexes() { + public List getDbIndexes() { return List.of( Indexes.ascending("name") ); diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java index 07c7a75764..4f2d8eed01 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java @@ -4,6 +4,7 @@ import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.Sorts; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -202,5 +203,20 @@ public CollectionStats collectionStats() { public void runPostUpgrade(ClientSession cs, CollectionUpgradeResult upgradeResult) { //nothing to do. - }; + } + + @Override + public List getDbIndexes() { + return List.of(); + } + + @Override + public void initDb() { + //add indexes as unique? + IndexOptions options = new IndexOptions().background(true); + List indexes = this.getDbIndexes(); + for (Bson index : indexes) { + this.getDocumentCollection().createIndex(index, options); + } + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/serviceState/db/OqmDatabaseService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/serviceState/db/OqmDatabaseService.java index 810fe4ae81..83e2245c99 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/serviceState/db/OqmDatabaseService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/serviceState/db/OqmDatabaseService.java @@ -2,6 +2,7 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.model.Filters; +import com.mongodb.client.model.Indexes; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import jakarta.validation.Valid; @@ -11,6 +12,7 @@ import lombok.NonNull; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.bson.conversions.Bson; import org.bson.types.ObjectId; import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -186,4 +188,11 @@ public boolean ensureDatabase(String dbName) { public int getCurrentSchemaVersion() { return OqmMongoDatabase.CUR_SCHEMA_VERSION; } + + @Override + public List getDbIndexes() { + return List.of( + Indexes.ascending("name") + ); + } } From 6d8f32c8b71416f91e68f163afaa9951e6754deb Mon Sep 17 00:00:00 2001 From: axgiri <146159445+axgiri@users.noreply.github.com> Date: Mon, 18 May 2026 13:50:22 +0200 Subject: [PATCH 5/6] move ensureItemMutexesExist call after db init --- .../main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java index 2b7511daea..3579e27e63 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java @@ -59,7 +59,6 @@ void onStart( @Observes StartupEvent ev ) { - this.ensureItemMutexesExist(); this.initDb(); } @@ -67,5 +66,6 @@ void initDb() { for(MongoService service : this.mongoServices){ service.initDb(); } + this.ensureItemMutexesExist(); } } From 9ac14ba8858a484c8a649279ba25e9d674eca540 Mon Sep 17 00:00:00 2001 From: axgiri <146159445+axgiri@users.noreply.github.com> Date: Tue, 19 May 2026 23:19:41 +0200 Subject: [PATCH 6/6] static implementation defined in MongoService --- .../oqm/core/api/service/mongo/MongoDbAwareService.java | 6 +----- .../ebp/oqm/core/api/service/mongo/MongoService.java | 9 +++++++++ .../oqm/core/api/service/mongo/TopLevelMongoService.java | 7 +------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java index 1a086c4efc..006e916e05 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoDbAwareService.java @@ -183,11 +183,7 @@ public List getDbIndexes() { } public void initDbByIdOrName(String oqmDbIdOrName) { - IndexOptions options = new IndexOptions().unique(true).background(true); - List indexes = this.getDbIndexes(); - for (Bson index : indexes) { - getDocumentCollection(oqmDbIdOrName).createIndex(index, options); - } + setupIndexes(getDocumentCollection(oqmDbIdOrName), this.getDbIndexes()); } public void initDb(){ diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java index 356a9823f4..03187b0e21 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java @@ -7,6 +7,8 @@ import com.mongodb.WriteConcern; import com.mongodb.client.ClientSession; import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.IndexOptions; import jakarta.inject.Inject; import jakarta.validation.Validation; import jakarta.validation.Validator; @@ -111,4 +113,11 @@ public MongoService(Class clazz) { public abstract List getDbIndexes(); public abstract void initDb(); + + protected static void setupIndexes(MongoCollection collection, List indexes) { + IndexOptions options = new IndexOptions().background(true); + for (Bson index : indexes) { + collection.createIndex(index, options); + } + } } diff --git a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java index 4f2d8eed01..31036922a6 100644 --- a/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java +++ b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/TopLevelMongoService.java @@ -212,11 +212,6 @@ public List getDbIndexes() { @Override public void initDb() { - //add indexes as unique? - IndexOptions options = new IndexOptions().background(true); - List indexes = this.getDbIndexes(); - for (Bson index : indexes) { - this.getDocumentCollection().createIndex(index, options); - } + setupIndexes(getDocumentCollection(), this.getDbIndexes()); } }