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 35e6a8979..5dcbb2e77 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,7 @@ public class LifecycleBean { @Inject ObjectSchemaUpgradeService objectSchemaUpgradeService; - + private ZonedDateTime startDateTime; public static void logConfig(){ 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 56f9783fa..3579e27e6 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,14 @@ 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.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; @@ -14,45 +18,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.initDb(); + } + + void initDb() { + for(MongoService service : this.mongoServices){ + service.initDb(); + } + this.ensureItemMutexesExist(); + } } 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 937bfbbe2..845face85 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,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.mongodb.client.ClientSession; import com.mongodb.client.FindIterable; +import com.mongodb.client.model.Indexes; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -13,6 +14,7 @@ import lombok.Getter; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.bson.conversions.Bson; import org.bson.types.ObjectId; import org.jetbrains.annotations.NotNull; import tech.ebp.oqm.core.api.config.CoreApiInteractingEntity; @@ -447,4 +449,11 @@ public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpg } } } + + @Override + 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/ItemListService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/ItemListService.java index 729c56f60..4dc99848e 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,9 +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.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; @@ -12,6 +14,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 +66,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( + 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 7e39a7a16..006e916e0 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,12 +4,14 @@ 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; 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; @@ -25,6 +27,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 +175,18 @@ protected > X addBaseStats public void runPostUpgrade(String oqmDbIdOrName, ClientSession cs, CollectionUpgradeResult upgradeResult) { //nothing to do. - }; + } + + @Override + public List getDbIndexes() { + return List.of(); + } + + public void initDbByIdOrName(String oqmDbIdOrName) { + setupIndexes(getDocumentCollection(oqmDbIdOrName), this.getDbIndexes()); + } + + 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/MongoService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoService.java index 6b2d49aa7..03187b0e2 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; @@ -14,11 +16,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 +109,15 @@ public MongoService(Class clazz) { } public abstract int getCurrentSchemaVersion(); + + 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/StorageBlockService.java b/software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StorageBlockService.java index 0de704677..4f1446e2d 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,6 +1,7 @@ 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; @@ -191,4 +192,11 @@ public Map> getReferencingObjects(String oqmDbIdOrName, Cl public int getCurrentSchemaVersion() { return StorageBlock.CUR_SCHEMA_VERSION; } + + @Override + 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 07c7a7576..31036922a 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,15 @@ public CollectionStats collectionStats() { public void runPostUpgrade(ClientSession cs, CollectionUpgradeResult upgradeResult) { //nothing to do. - }; + } + + @Override + public List getDbIndexes() { + return List.of(); + } + + @Override + public void initDb() { + setupIndexes(getDocumentCollection(), this.getDbIndexes()); + } } 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 810fe4ae8..83e2245c9 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") + ); + } }