Skip to content

Commit

Permalink
[Fix #2169] Allow filtering over processInstances.definition and defi…
Browse files Browse the repository at this point in the history
…nition.metadata (#2191)

* [Fix_#2169] Supporting query over ProcessInstance.definition

* [Fix_#2169] Fixing broken tests

* Revert "[Fix_#2169] Fixing broken tests"

This reverts commit bede427.

* [Fix #2169] Alternative approach

* [Fix #2169] Metadata query IT

* [Fix #2169] Annotation query IT

* [Fix #2169] Simplifying Flyway script

* [Fix #2169] Walters comments
  • Loading branch information
fjtirado authored Feb 19, 2025
1 parent b94e4b5 commit 891401f
Show file tree
Hide file tree
Showing 21 changed files with 280 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public static ProcessDefinition merge(ProcessDefinition instance, ProcessDefinit
instance.setEndpoint(doMerge(data.getEndpoint(), instance.getEndpoint()));
instance.setDescription(doMerge(data.getDescription(), instance.getDescription()));
instance.setAnnotations(doMerge(data.getAnnotations(), instance.getAnnotations()));
instance.setMetadata(CommonUtils.mergeMap(toStringMap(data.getMetadata()), instance.getMetadata()));
instance.setMetadata(CommonUtils.mergeMap(toObjectMap(data.getMetadata()), instance.getMetadata()));
instance.setNodes(doMerge(nodeDefinitions(data), instance.getNodes()));
instance.setSource(doMerge(data.getSource(), instance.getSource()));
return instance;
Expand Down Expand Up @@ -95,6 +95,10 @@ private static <T> T doMerge(T incoming, T current) {
return current;
}

private static Map<String, Object> toObjectMap(Map<String, ?> map) {
return map == null ? null : Collections.unmodifiableMap(map);
}

private static Map<String, String> toStringMap(Map<String, ?> input) {
if (input == null) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public String getProcessInstanceServiceUrl(DataFetchingEnvironment env) {

public ProcessDefinition getProcessDefinition(DataFetchingEnvironment env) {
ProcessInstance source = env.getSource();
return cacheService.getProcessDefinitionStorage().get(new ProcessDefinitionKey(source.getProcessId(), source.getVersion()));
return source.getDefinition();
}

protected String getServiceUrl(String endpoint, String processId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ input ProcessDefinitionArgument {
id: StringArgument
name: StringArgument
version: StringArgument
annotations: StringArrayArgument
roles: StringArrayArgument
serviceUrl: StringArgument
description: StringArgument
type: StringArgument
metadata: JSON
}

type ProcessInstance {
Expand Down Expand Up @@ -194,6 +200,7 @@ input ProcessInstanceArgument {
businessKey: StringArgument
createdBy: StringArgument
updatedBy: StringArgument
definition: ProcessDefinitionArgument
}

input ProcessInstanceErrorArgument {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class ProcessDefinition {
private String source;
private String description;
private Set<String> annotations;
private Map<String, String> metadata;
private Map<String, Object> metadata;
private List<Node> nodes;

public String getId() {
Expand Down Expand Up @@ -126,11 +126,11 @@ public void setAnnotations(Set<String> annotations) {
this.annotations = annotations;
}

public Map<String, String> getMetadata() {
public Map<String, Object> getMetadata() {
return metadata;
}

public void setMetadata(Map<String, String> metadata) {
public void setMetadata(Map<String, Object> metadata) {
this.metadata = metadata;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
import java.util.List;
import java.util.function.BiConsumer;

import org.assertj.core.groups.Tuple;
import org.kie.kogito.index.model.ProcessDefinitionKey;

import com.fasterxml.jackson.databind.node.ObjectNode;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down Expand Up @@ -55,4 +58,12 @@ public static <V> BiConsumer<List<V>, String[]> assertNotId() {
return (instances, ids) -> assertThat(instances).extracting("id").doesNotContainAnyElementsOf(List.of(ids));
}

public static <V> BiConsumer<List<V>, ProcessDefinitionKey[]> assertWithKey() {
return (instances, ids) -> assertThat(instances).hasSize(ids == null ? 0 : ids.length).extracting("id", "version").map(Tuple::toArray)
.map(objs -> new ProcessDefinitionKey((String) objs[0], (String) objs[1])).containsExactly(ids);
}

public static <V> BiConsumer<List<V>, ProcessDefinitionKey[]> assertNoKey() {
return (instances, ids) -> assertThat(instances).isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,8 @@
*/
package org.kie.kogito.index.test.query;

import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;

import org.assertj.core.groups.Tuple;
import org.junit.jupiter.api.Test;
import org.kie.kogito.index.model.ProcessDefinition;
import org.kie.kogito.index.model.ProcessDefinitionKey;
Expand All @@ -33,7 +30,7 @@

import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.kie.kogito.index.test.QueryTestUtils.assertWithKey;
import static org.kie.kogito.persistence.api.query.QueryFilterFactory.contains;
import static org.kie.kogito.persistence.api.query.QueryFilterFactory.containsAll;
import static org.kie.kogito.persistence.api.query.QueryFilterFactory.containsAny;
Expand Down Expand Up @@ -71,9 +68,4 @@ void testProcessDefinitionQuery() {
null, pdv2Key, pdv1Key);
}

public static <V> BiConsumer<List<V>, ProcessDefinitionKey[]> assertWithKey() {
return (instances, ids) -> assertThat(instances).hasSize(ids == null ? 0 : ids.length).extracting("id", "version").map(Tuple::toArray)
.map(objs -> new ProcessDefinitionKey((String) objs[0], (String) objs[1])).containsExactly(ids);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
Expand Down Expand Up @@ -61,7 +62,7 @@ public ProcessDefinition readFrom(ProtoStreamReader reader) throws IOException {
pd.setName(reader.readString(NAME));
pd.setDescription(reader.readString(DESCRIPTION));
pd.setAnnotations(reader.readCollection(ANNOTATIONS, new HashSet<>(), String.class));
pd.setMetadata(buildMetadata(reader));
pd.setMetadata(Collections.unmodifiableMap(buildMetadata(reader)));
pd.setRoles(reader.readCollection(ROLES, new HashSet<>(), String.class));
pd.setAddons(reader.readCollection(ADDONS, new HashSet<>(), String.class));
pd.setType(reader.readString(TYPE));
Expand Down Expand Up @@ -97,7 +98,8 @@ public void writeTo(ProtoStreamWriter writer, ProcessDefinition pd) throws IOExc
private static Set<Entry> buildMetadata(ProcessDefinition pd) {
return Optional.ofNullable(pd.getMetadata())
.map(Map::entrySet)
.map(entries -> entries.stream().map(e -> new Entry(e.getKey(), e.getValue())).collect(Collectors.toSet()))
.map(entries -> entries.stream().filter(e -> e.getValue() != null)
.map(e -> new Entry(e.getKey(), e.getValue().toString())).collect(Collectors.toSet()))
.orElse(null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.infinispan.protostream.MessageMarshaller;
import org.junit.jupiter.api.Test;
Expand All @@ -29,7 +30,6 @@
import org.mockito.InOrder;

import static java.util.Collections.singleton;
import static java.util.stream.Collectors.toSet;
import static org.assertj.core.api.Assertions.assertThat;
import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.ADDONS;
import static org.kie.kogito.index.infinispan.protostream.ProcessDefinitionMarshaller.ANNOTATIONS;
Expand All @@ -48,6 +48,9 @@

class ProcessDefinitionMarshallerTest {

private static final String metaKey = "key1";
private final String metaValue = "value1";

@Test
void testReadFrom() throws IOException {
MessageMarshaller.ProtoStreamReader reader = mock(MessageMarshaller.ProtoStreamReader.class);
Expand All @@ -56,7 +59,7 @@ void testReadFrom() throws IOException {
when(reader.readString(NAME)).thenReturn("processName");
when(reader.readString(DESCRIPTION)).thenReturn("descr");
when(reader.readCollection(eq(ANNOTATIONS), any(), eq(String.class))).thenReturn(new HashSet<>(singleton("tag1")));
when(reader.readCollection(eq(METADATA), any(), eq(Entry.class))).thenReturn(new HashSet<>(singleton(new Entry("key1", "value1"))));
when(reader.readCollection(eq(METADATA), any(), eq(Entry.class))).thenReturn(new HashSet<>(singleton(new Entry(metaKey, metaValue))));
when(reader.readCollection(eq(ROLES), any(), eq(String.class))).thenReturn(new HashSet<>(singleton("admin")));
when(reader.readCollection(eq(ADDONS), any(), eq(String.class))).thenReturn(new HashSet<>(singleton("process-management")));
when(reader.readString(TYPE)).thenReturn("processType");
Expand All @@ -71,7 +74,7 @@ void testReadFrom() throws IOException {
.hasFieldOrPropertyWithValue(NAME, "processName")
.hasFieldOrPropertyWithValue(DESCRIPTION, "descr")
.hasFieldOrPropertyWithValue(ANNOTATIONS, singleton("tag1"))
.hasFieldOrPropertyWithValue(METADATA, Map.of("key1", "value1"))
.hasFieldOrPropertyWithValue(METADATA, Map.of(metaKey, metaValue))
.hasFieldOrPropertyWithValue(ROLES, singleton("admin"))
.hasFieldOrPropertyWithValue(ADDONS, singleton("process-management"))
.hasFieldOrPropertyWithValue(TYPE, "processType");
Expand All @@ -90,13 +93,14 @@ void testReadFrom() throws IOException {

@Test
void testWriteTo() throws IOException {

ProcessDefinition pd = new ProcessDefinition();
pd.setId("processId");
pd.setVersion("1.0");
pd.setName("processName");
pd.setDescription("descr");
pd.setAnnotations(singleton("tag1"));
pd.setMetadata(Map.of("key1", "value1"));
pd.setMetadata(Map.of(metaKey, metaValue));
pd.setRoles(singleton("admin"));
pd.setAddons(singleton("process-management"));
pd.setType("processType");
Expand All @@ -112,7 +116,7 @@ void testWriteTo() throws IOException {
inOrder.verify(writer).writeString(NAME, pd.getName());
inOrder.verify(writer).writeString(DESCRIPTION, pd.getDescription());
inOrder.verify(writer).writeCollection(ANNOTATIONS, pd.getAnnotations(), String.class);
inOrder.verify(writer).writeCollection(METADATA, pd.getMetadata().entrySet().stream().map(e -> new Entry(e.getKey(), e.getValue())).collect(toSet()), Entry.class);
inOrder.verify(writer).writeCollection(METADATA, Set.of(new Entry(metaKey, metaValue)), Entry.class);
inOrder.verify(writer).writeCollection(ROLES, pd.getRoles(), String.class);
inOrder.verify(writer).writeCollection(ADDONS, pd.getAddons(), String.class);
inOrder.verify(writer).writeString(TYPE, pd.getType());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@
*/
package org.kie.kogito.index.jpa.mapper;

import java.util.Map;

import org.kie.kogito.index.jpa.model.ProcessDefinitionEntity;
import org.kie.kogito.index.model.ProcessDefinition;
import org.kie.kogito.jackson.utils.JsonObjectUtils;
import org.mapstruct.AfterMapping;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

@Mapper(componentModel = "cdi", suppressTimestampInGenerated = true)
public interface ProcessDefinitionEntityMapper {

Expand All @@ -41,6 +47,15 @@ default String map(byte[] value) {
return value == null ? null : new String(value);
}

default ObjectNode map(Map<String, Object> model) {
JsonNode entity = JsonObjectUtils.fromValue(model);
return entity == null || !entity.isObject() ? null : (ObjectNode) entity;
}

default Map<String, Object> map(ObjectNode entity) {
return (Map<String, Object>) JsonObjectUtils.convertValue(entity, Map.class);
}

@AfterMapping
default void afterMapping(@MappingTarget ProcessDefinitionEntity entity) {
if (entity.getNodes() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@
package org.kie.kogito.index.jpa.mapper;

import org.kie.kogito.index.jpa.model.MilestoneEntity;
import org.kie.kogito.index.jpa.model.ProcessDefinitionEntity;
import org.kie.kogito.index.jpa.model.ProcessInstanceEntity;
import org.kie.kogito.index.model.Milestone;
import org.kie.kogito.index.model.ProcessDefinition;
import org.kie.kogito.index.model.ProcessInstance;
import org.mapstruct.AfterMapping;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "cdi", suppressTimestampInGenerated = true)
public interface ProcessInstanceEntityMapper {
Expand All @@ -40,6 +43,10 @@ public interface ProcessInstanceEntityMapper {
@InheritInverseConfiguration
ProcessInstance mapToModel(ProcessInstanceEntity pi);

default ProcessDefinition mapToDefinition(ProcessDefinitionEntity entity) {
return Mappers.getMapper(ProcessDefinitionEntityMapper.class).mapToModel(entity);
}

@AfterMapping
default void afterMapping(@MappingTarget ProcessInstanceEntity entity) {
entity.getNodes().forEach(n -> n.setProcessInstance(entity));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,24 @@
package org.kie.kogito.index.jpa.model;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import org.kie.kogito.index.model.ProcessDefinitionKey;
import org.kie.kogito.persistence.postgresql.hibernate.JsonBinaryConverter;

import com.fasterxml.jackson.databind.node.ObjectNode;

import jakarta.persistence.CascadeType;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.MapKeyColumn;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;

Expand Down Expand Up @@ -74,13 +76,9 @@ public class ProcessDefinitionEntity extends AbstractEntity {
@JoinColumn(name = "process_version", referencedColumnName = "version") }, foreignKey = @ForeignKey(name = "fk_definitions_annotations"))
@Column(name = "annotation")
private Set<String> annotations;
@ElementCollection
@CollectionTable(name = "definitions_metadata", joinColumns = {
@JoinColumn(name = "process_id", referencedColumnName = "id"), @JoinColumn(name = "process_version", referencedColumnName = "version") },
foreignKey = @ForeignKey(name = "fk_definitions_metadata"))
@MapKeyColumn(name = "name")
@Column(name = "meta_value")
private Map<String, String> metadata;
@Convert(converter = JsonBinaryConverter.class)
@Column(columnDefinition = "jsonb")
private ObjectNode metadata;

@Override
public String getId() {
Expand Down Expand Up @@ -171,11 +169,11 @@ public void setAnnotations(Set<String> annotations) {
this.annotations = annotations;
}

public Map<String, String> getMetadata() {
public ObjectNode getMetadata() {
return metadata;
}

public void setMetadata(Map<String, String> metadata) {
public void setMetadata(ObjectNode metadata) {
this.metadata = metadata;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import java.util.Objects;
import java.util.Set;

import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import org.kie.kogito.persistence.postgresql.hibernate.JsonBinaryConverter;

import com.fasterxml.jackson.databind.node.ObjectNode;
Expand All @@ -34,9 +36,12 @@
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinColumns;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;

Expand Down Expand Up @@ -85,6 +90,12 @@ public class ProcessInstanceEntity extends AbstractEntity {
@Embedded
private ProcessInstanceErrorEntity error;

@ManyToOne(targetEntity = ProcessDefinitionEntity.class, fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "processId", referencedColumnName = "id", insertable = false, updatable = false),
@JoinColumn(name = "version", referencedColumnName = "version", insertable = false, updatable = false) })
@NotFound(action = NotFoundAction.IGNORE)
private ProcessDefinitionEntity definition;

@Override
public String getId() {
return id;
Expand Down Expand Up @@ -279,6 +290,10 @@ public int hashCode() {
return Objects.hash(id);
}

public ProcessDefinitionEntity getDefinition() {
return definition;
}

@Override
public String toString() {
return "ProcessInstanceEntity{" +
Expand Down
Loading

0 comments on commit 891401f

Please sign in to comment.