> getEntityIndexBlacklist() {
+ return List.of();
+ }
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/configuration/properties/DataConfigurationProperties.java b/application-engine/src/main/java/com/netgrif/application/engine/configuration/properties/DataConfigurationProperties.java
index 80bf1af1f3d..36cfbb61506 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/configuration/properties/DataConfigurationProperties.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/configuration/properties/DataConfigurationProperties.java
@@ -11,13 +11,11 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
-import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
import java.time.Duration;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* Configuration properties for the application engine's data functionality.
@@ -137,6 +135,15 @@ public static class MongoProperties extends org.springframework.boot.autoconfigu
* Ensures indexes are applied during initialization, if true.
*/
private Boolean runnerEnsureIndex = true;
+
+ /**
+ * Multi-value map for MongoDB indexes.
+ *
+ * This property holds a mapping between entity classes and their associated
+ * collection of index definitions. Each entry in the map corresponds to a class
+ * and its set of index configurations for MongoDB.
+ */
+ private MultiValueMap, String> indexes = new LinkedMultiValueMap<>();
}
/**
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MongoDbRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MongoDbRunner.java
index fb0a2cf8f42..f77d7af06c9 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MongoDbRunner.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MongoDbRunner.java
@@ -1,25 +1,16 @@
package com.netgrif.application.engine.startup.runner;
+import com.netgrif.application.engine.configuration.MongoIndexesConfigurator;
import com.netgrif.application.engine.configuration.properties.DataConfigurationProperties;
import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner;
import com.netgrif.application.engine.startup.annotation.RunnerOrder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.context.annotation.Profile;
-import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.index.IndexOperations;
-import org.springframework.data.mongodb.core.index.IndexResolver;
-import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
-import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
import org.springframework.stereotype.Component;
-import static org.eclipse.jdt.internal.compiler.parser.Parser.name;
-
@Slf4j
@Component
@Profile("!test")
@@ -31,30 +22,21 @@ public class MongoDbRunner implements ApplicationEngineStartupRunner {
private final MongoTemplate mongoTemplate;
+ private final MongoIndexesConfigurator mongoIndexesConfigurator;
+
@Override
public void run(ApplicationArguments args) throws Exception {
if (mongoProperties.getDrop()) {
if (mongoProperties.getHost() != null && mongoProperties.getPort() != null)
- log.info("Dropping Mongo database {}:{}/{}", mongoProperties.getHost(), mongoProperties.getPort(), name);
+ log.info("Dropping Mongo database {}:{}/{}", mongoProperties.getHost(), mongoProperties.getPort(), mongoProperties.getDatabase());
else if (mongoProperties.getUri() != null)
log.info("Dropping Mongo database {}", mongoProperties.getUri());
mongoTemplate.getDb().drop();
}
if (mongoProperties.getRunnerEnsureIndex()) {
- resolveIndexes();
+ mongoIndexesConfigurator.resolveIndexes();
}
}
- void resolveIndexes() {
- MappingContext extends MongoPersistentEntity>, MongoPersistentProperty> mappingContext = mongoTemplate.getConverter().getMappingContext();
- IndexResolver resolver = new MongoPersistentEntityIndexResolver(mappingContext);
- mappingContext.getPersistentEntities()
- .stream()
- .filter(it -> it.isAnnotationPresent(Document.class))
- .forEach(it -> {
- IndexOperations indexOps = mongoTemplate.indexOps(it.getType());
- log.info("Ensuring existence of indexes for {}", it.getType().getSimpleName());
- resolver.resolveIndexFor(it.getType()).forEach(indexOps::ensureIndex);
- });
- }
+
}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/annotations/Indexed.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/annotations/Indexed.java
new file mode 100644
index 00000000000..32c57ef33e2
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/annotations/Indexed.java
@@ -0,0 +1,11 @@
+package com.netgrif.application.engine.objects.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Indexed {
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/User.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/User.java
index 8cdc0198f89..6c49d9cef4d 100644
--- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/User.java
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/User.java
@@ -1,6 +1,8 @@
package com.netgrif.application.engine.objects.auth.domain;
import com.netgrif.application.engine.objects.auth.domain.enums.UserState;
+import com.netgrif.application.engine.objects.annotations.Indexed;
+import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole;
import com.netgrif.application.engine.objects.utils.DateUtils;
import com.querydsl.core.annotations.QueryEntity;
import lombok.AllArgsConstructor;
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java
index c408e325040..34c21683987 100644
--- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.netgrif.application.engine.objects.auth.domain.ActorRef;
+import com.netgrif.application.engine.objects.annotations.Indexed;
import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
import com.netgrif.application.engine.objects.petrinet.domain.dataset.*;
@@ -38,6 +39,7 @@ public abstract class Case implements Serializable {
@NotNull
@Setter
+ @Indexed
private ObjectId petriNetObjectId;
@JsonIgnore
@@ -54,6 +56,7 @@ public abstract class Case implements Serializable {
@NotNull
@Setter
+ @Indexed
private String title;
private String color;
@@ -76,6 +79,7 @@ public abstract class Case implements Serializable {
private List> immediateData;
@Setter
+ @Indexed
private ActorRef author;
@Setter
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java
index 0a1f0cc8351..eb52c24a819 100644
--- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java
@@ -1,6 +1,7 @@
package com.netgrif.application.engine.objects.workflow.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.netgrif.application.engine.objects.annotations.Indexed;
import com.netgrif.application.engine.objects.auth.domain.AbstractUser;
import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field;
@@ -32,14 +33,17 @@ public abstract class Task implements Serializable {
private ProcessResourceId _id;
@Getter
+ @Indexed
private String processId;
@Getter
@Setter
+ @Indexed
private String caseId;
@Getter
@Setter
+ @Indexed
private String transitionId;
@Getter
@@ -63,6 +67,7 @@ public abstract class Task implements Serializable {
private Integer priority;
@Setter
+ @Indexed
private String userId;
@Setter
diff --git a/nae-spring-core-adapter/pom.xml b/nae-spring-core-adapter/pom.xml
index 18d69056e19..4186579e94e 100644
--- a/nae-spring-core-adapter/pom.xml
+++ b/nae-spring-core-adapter/pom.xml
@@ -103,6 +103,10 @@
querydsl-core
${querydsl.version}