diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java index 51ace92131..6e836b94ce 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseMappingService.java @@ -83,6 +83,8 @@ protected Optional transformDataField(String fieldId, Case useCase) { return this.transformCaseFieldField(caseField, (com.netgrif.application.engine.objects.petrinet.domain.dataset.CaseField) netField); } else if (netField instanceof com.netgrif.application.engine.objects.petrinet.domain.dataset.FilterField) { return this.transformFilterFieldField(caseField, (com.netgrif.application.engine.objects.petrinet.domain.dataset.FilterField) netField); + } else if (netField instanceof com.netgrif.application.engine.objects.petrinet.domain.dataset.StringCollectionField) { + return this.transformStringCollectionField(caseField, (com.netgrif.application.engine.objects.petrinet.domain.dataset.StringCollectionField) netField); } else { String string = caseField.getValue().toString(); if (string == null) @@ -127,6 +129,14 @@ protected Optional transformFilterFieldField(com.netgrif.application. return Optional.of(new com.netgrif.application.engine.adapter.spring.elastic.domain.FilterField(dataField.getValue().toString(),allowedNets, filterMetadata)); } + protected Optional transformStringCollectionField(com.netgrif.application.engine.objects.workflow.domain.DataField dataField, com.netgrif.application.engine.objects.petrinet.domain.dataset.StringCollectionField netField) { + if (dataField.getValue() != null && dataField.getValue() instanceof Collection && !((Collection) dataField.getValue()).isEmpty()) { + String[] values = ((Collection) dataField.getValue()).toArray(new String[0]); + return Optional.of(new com.netgrif.application.engine.adapter.spring.elastic.domain.StringCollectionField(values)); + } + return Optional.empty(); + } + protected Optional transformEnumerationMapField (com.netgrif.application.engine.objects.workflow.domain.DataField enumMap, EnumerationMapField netField) { Map options = this.getFieldOptions(enumMap, netField); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java index d4ae214c26..07d6901189 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java @@ -1,6 +1,7 @@ package com.netgrif.application.engine.elastic.service; import co.elastic.clients.elasticsearch._types.FieldValue; +import co.elastic.clients.elasticsearch._types.mapping.FieldType; import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery; import co.elastic.clients.elasticsearch._types.query_dsl.QueryStringQuery; import co.elastic.clients.elasticsearch._types.query_dsl.TermsQueryField; @@ -138,7 +139,7 @@ public Page search(List requests, LoggedUser user, Page // TODO: impersonation // LoggedUser loggedOrImpersonated = user.getSelfOrImpersonated(); LoggedUser loggedOrImpersonated = user; - pageable = resolveUnmappedSortAttributes(pageable); +// pageable = resolveUnmappedSortAttributes(pageable); NativeQuery query = buildQuery(requests, loggedOrImpersonated, pageable, locale, isIntersection); List casePage; long total; @@ -190,11 +191,22 @@ protected NativeQuery buildQuery(List requests, LoggedUser us BinaryOperator reductionOperation = isIntersection ? (a, b) -> a.must(b.build()._toQuery()) : (a, b) -> a.should(b.build()._toQuery()); BoolQuery.Builder query = singleQueries.stream().reduce(new BoolQuery.Builder(), reductionOperation); - NativeQueryBuilder builder = new NativeQueryBuilder(); - return builder + NativeQueryBuilder builder = new NativeQueryBuilder() .withQuery(query.build()._toQuery()) - .withPageable(pageable) - .build(); + .withPageable(PageRequest.of(pageable.getPageNumber(), pageable.getPageSize())); + + for (org.springframework.data.domain.Sort.Order o : pageable.getSort()) { + builder.withSort(s -> s.field(f -> f + .field(o.getProperty()) + .order(o.isAscending() + ? co.elastic.clients.elasticsearch._types.SortOrder.Asc + : co.elastic.clients.elasticsearch._types.SortOrder.Desc) + .unmappedType(FieldType.Keyword) + .missing("_last") + )); + } + + return builder.build(); } protected BoolQuery.Builder buildSingleQuery(CaseSearchRequest request, LoggedUser user, Locale locale) { diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/StringCollectionField.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/StringCollectionField.java new file mode 100644 index 0000000000..c4b4cb972c --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/StringCollectionField.java @@ -0,0 +1,19 @@ +package com.netgrif.application.engine.objects.elastic.domain; + + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public abstract class StringCollectionField extends TextField { + + public String[] collectionValue; + + public StringCollectionField(String[] values) { + super(values); + this.collectionValue = values; + } +} diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/BooleanField.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/BooleanField.java index a1bf70e00a..3239262280 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/BooleanField.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/BooleanField.java @@ -14,6 +14,7 @@ public class BooleanField extends com.netgrif.application.engine.objects.elastic public BooleanField(Boolean value) { super(value); + this.booleanValue = value; } @Override diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java index 7ee9749d94..661cd3868c 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java @@ -4,17 +4,13 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; -import org.springframework.data.elasticsearch.annotations.DateFormat; -import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.annotations.Field; -import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.data.elasticsearch.annotations.*; import java.time.LocalDateTime; import java.util.Map; import java.util.Set; -import static org.springframework.data.elasticsearch.annotations.FieldType.Flattened; -import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword; +import static org.springframework.data.elasticsearch.annotations.FieldType.*; @NoArgsConstructor @Document(indexName = "#{@elasticCaseIndex}") @@ -29,10 +25,30 @@ public void update(ElasticCase useCase) { } @Id + @Field(type = Keyword) public String getId() { return super.getId(); } + @MultiField( + mainField = @Field(type = Text), + otherFields = { + @InnerField(suffix = "keyword", type = Keyword) + }) + public String getTitle() { + return super.getTitle(); + } + + @Field(type = Keyword) + public String getVisualId() { + return super.getVisualId(); + } + + @Field(type = Keyword) + public String getCaseId() { + return super.getId(); + } + @Version public Long getVersion() { return super.getVersion(); @@ -48,7 +64,7 @@ public String getProcessId() { return super.getProcessId(); } - @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second_millis) + @Field(type = Date, format = DateFormat.date_hour_minute_second_millis) public LocalDateTime getCreationDate() { return super.getCreationDate(); } @@ -63,7 +79,11 @@ public String getAuthorRealm() { return super.getAuthorRealm(); } - @Field(type = Keyword) + @MultiField( + mainField = @Field(type = Text), + otherFields = { + @InnerField(suffix = "keyword", type = Keyword) + }) public String getAuthorName() { return super.getAuthorName(); } diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/StringCollectionField.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/StringCollectionField.java new file mode 100644 index 0000000000..4786a4d2d4 --- /dev/null +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/StringCollectionField.java @@ -0,0 +1,32 @@ +package com.netgrif.application.engine.adapter.spring.elastic.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.data.elasticsearch.annotations.Field; + +import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword; +import static org.springframework.data.elasticsearch.annotations.FieldType.Text; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class StringCollectionField extends com.netgrif.application.engine.objects.elastic.domain.StringCollectionField { + + public StringCollectionField(String[] values) { + super(values); + } + + @Override + @Field(type = Text) + public String[] getFulltextValue() { + return super.getFulltextValue(); + } + + @Override + @Field(type = Keyword) + public String[] getCollectionValue() { + return super.getCollectionValue(); + } + +}