Skip to content

Commit c043e2b

Browse files
authored
Merge pull request #62 from rgdoliveira/sync_main
Sync main branch with Apache main branch
2 parents bd7d519 + d0ca2db commit c043e2b

File tree

26 files changed

+309
-44
lines changed

26 files changed

+309
-44
lines changed

.rat-excludes

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ org.kie.kogito.app.audit.spi.GraphQLSchemaQueryProvider
4040
application.properties
4141
# data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
4242
basic.schema.graphqls
43+
# data-index/data-index-graphql/src/main/resources/count.schema.graphqls
44+
count.schema.graphqls
45+
# data-index/data-index-graphql/src/main/resources/json.schema.graphqls
46+
json.schema.graphqls
4347
# data-index/data-index-service/data-index-service-common/src/main/resources/domain.schema.graphqls
4448
domain.schema.graphqls
4549
# /data-index/data-index-mutations/data-index-shared-output-mutation/src/main/resources/mutation.schema.graphqls
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
ALTER TABLE Process_Instance_Variable_Log ALTER COLUMN variable_value SET DATA TYPE VARCHAR(MAX);
21+
ALTER TABLE Task_Instance_Variable_Log ALTER COLUMN variable_value SET DATA TYPE VARCHAR(MAX);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
21+
ALTER TABLE Process_Instance_Variable_Log ALTER COLUMN variable_value TYPE TEXT;
22+
ALTER TABLE Task_Instance_Variable_Log ALTER COLUMN variable_value TYPE TEXT;

data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java

+56-12
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import java.util.Collection;
2222
import java.util.List;
2323
import java.util.Map;
24-
import java.util.Objects;
2524
import java.util.ServiceLoader;
2625
import java.util.ServiceLoader.Provider;
2726
import java.util.concurrent.CompletableFuture;
@@ -31,6 +30,7 @@
3130
import org.kie.kogito.index.CommonUtils;
3231
import org.kie.kogito.index.api.KogitoRuntimeClient;
3332
import org.kie.kogito.index.graphql.query.GraphQLQueryOrderByParser;
33+
import org.kie.kogito.index.graphql.query.GraphQLQueryParser;
3434
import org.kie.kogito.index.graphql.query.GraphQLQueryParserRegistry;
3535
import org.kie.kogito.index.model.Job;
3636
import org.kie.kogito.index.model.Node;
@@ -41,13 +41,16 @@
4141
import org.kie.kogito.index.service.DataIndexServiceException;
4242
import org.kie.kogito.index.storage.DataIndexStorageService;
4343
import org.kie.kogito.persistence.api.StorageFetcher;
44+
import org.kie.kogito.persistence.api.StorageServiceCapability;
4445
import org.kie.kogito.persistence.api.query.Query;
4546
import org.slf4j.Logger;
4647
import org.slf4j.LoggerFactory;
4748

4849
import graphql.schema.DataFetcher;
4950
import graphql.schema.DataFetchingEnvironment;
51+
import graphql.schema.GraphQLArgument;
5052
import graphql.schema.GraphQLInputObjectType;
53+
import graphql.schema.GraphQLInputType;
5154
import graphql.schema.GraphQLNamedType;
5255
import graphql.schema.GraphQLScalarType;
5356
import graphql.schema.GraphQLSchema;
@@ -109,6 +112,29 @@ protected final void loadAdditionalMutations(TypeDefinitionRegistry typeRegistry
109112
mutations.stream().map(GraphQLMutationsProvider::registry).forEach(typeRegistry::merge);
110113
}
111114

115+
protected final void addCountQueries(TypeDefinitionRegistry typeRegistry) {
116+
if (supportsCount()) {
117+
typeRegistry.merge(loadSchemaDefinitionFile("count.schema.graphqls"));
118+
}
119+
}
120+
121+
protected final void addJsonQueries(TypeDefinitionRegistry typeRegistry) {
122+
if (cacheService.capabilities().contains(StorageServiceCapability.JSON_QUERY)) {
123+
typeRegistry.merge(loadSchemaDefinitionFile("json.schema.graphqls"));
124+
}
125+
}
126+
127+
protected final void addCountQueries(Builder builder) {
128+
if (supportsCount()) {
129+
builder.dataFetcher("CountProcessInstances", this::countProcessInstances);
130+
builder.dataFetcher("CountUserTaskInstances", this::countUserTaskInstances);
131+
}
132+
}
133+
134+
private boolean supportsCount() {
135+
return cacheService.capabilities().contains(StorageServiceCapability.COUNT);
136+
}
137+
112138
protected TypeDefinitionRegistry loadSchemaDefinitionFile(String fileName) {
113139
return CommonUtils.loadSchemaDefinitionFile(fileName);
114140
}
@@ -149,7 +175,7 @@ public String getProcessInstanceServiceUrl(DataFetchingEnvironment env) {
149175

150176
public ProcessDefinition getProcessDefinition(DataFetchingEnvironment env) {
151177
ProcessInstance source = env.getSource();
152-
return source.getDefinition();
178+
return cacheService.getProcessDefinitionStorage().get(new ProcessDefinitionKey(source.getProcessId(), source.getVersion()));
153179
}
154180

155181
protected String getServiceUrl(String endpoint, String processId) {
@@ -182,18 +208,17 @@ protected Collection<ProcessInstance> getProcessInstancesValues(DataFetchingEnvi
182208
return executeAdvancedQueryForCache(cacheService.getProcessInstanceStorage(), env);
183209
}
184210

185-
protected <K, T> List<T> executeAdvancedQueryForCache(StorageFetcher<K, T> cache, DataFetchingEnvironment env) {
186-
Objects.requireNonNull(cache, "Cache not found");
187-
188-
String inputTypeName = ((GraphQLNamedType) env.getFieldDefinition().getArgument("where").getType()).getName();
189-
190-
Query<T> query = cache.query();
211+
protected long countProcessInstances(DataFetchingEnvironment env) {
212+
return executeCount(cacheService.getProcessInstanceStorage(), env);
213+
}
191214

192-
Map<String, Object> where = env.getArgument("where");
193-
query.filter(GraphQLQueryParserRegistry.get().getParser(inputTypeName).apply(where));
215+
protected long countUserTaskInstances(DataFetchingEnvironment env) {
216+
return executeCount(cacheService.getUserTaskInstanceStorage(), env);
217+
}
194218

219+
protected <K, T> List<T> executeAdvancedQueryForCache(StorageFetcher<K, T> cache, DataFetchingEnvironment env) {
220+
Query<T> query = buildQuery(cache, env);
195221
query.sort(new GraphQLQueryOrderByParser().apply(env));
196-
197222
Map<String, Integer> pagination = env.getArgument("pagination");
198223
if (pagination != null) {
199224
Integer limit = pagination.get("limit");
@@ -205,10 +230,29 @@ protected <K, T> List<T> executeAdvancedQueryForCache(StorageFetcher<K, T> cache
205230
query.offset(offset);
206231
}
207232
}
208-
209233
return query.execute();
210234
}
211235

236+
protected <K, T> long executeCount(StorageFetcher<K, T> cache, DataFetchingEnvironment env) {
237+
return buildQuery(cache, env).count();
238+
}
239+
240+
private <K, T> Query<T> buildQuery(StorageFetcher<K, T> cache, DataFetchingEnvironment env) {
241+
assert cache != null;
242+
Query<T> query = cache.query();
243+
GraphQLArgument arg = env.getFieldDefinition().getArgument("where");
244+
if (arg != null) {
245+
GraphQLInputType inputType = arg.getType();
246+
if (inputType instanceof GraphQLNamedType) {
247+
GraphQLQueryParser parser = GraphQLQueryParserRegistry.get().getParser(((GraphQLNamedType) inputType).getName());
248+
if (parser != null) {
249+
query.filter(parser.apply(env.getArgument("where")));
250+
}
251+
}
252+
}
253+
return query;
254+
}
255+
212256
protected Collection<UserTaskInstance> getUserTaskInstancesValues(DataFetchingEnvironment env) {
213257
return executeAdvancedQueryForCache(cacheService.getUserTaskInstanceStorage(), env);
214258
}

data-index/data-index-graphql/src/main/resources/basic.schema.graphqls

-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ input ProcessDefinitionArgument {
6969
serviceUrl: StringArgument
7070
description: StringArgument
7171
type: StringArgument
72-
metadata: JSON
7372
}
7473

7574
type ProcessInstance {
@@ -183,7 +182,6 @@ input ProcessInstanceArgument {
183182
id: IdArgument
184183
processId: StringArgument
185184
processName: StringArgument
186-
variables: JSON
187185
parentProcessInstanceId: IdArgument
188186
rootProcessInstanceId: IdArgument
189187
rootProcessId: StringArgument
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extend type Query {
2+
CountProcessInstances(where: ProcessInstanceArgument): Int
3+
CountUserTaskInstances(where: UserTaskInstanceArgument): Int
4+
CountJobs(where: JobArgument): Int
5+
CountProcessDefinitions(where: ProcessDefinitionArgument): Int
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
extend input ProcessInstanceArgument {
2+
variables: JSON
3+
}
4+
5+
extend input ProcessDefinitionArgument {
6+
metadata: JSON
7+
}

data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java

+3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public GraphQLSchema createSchema() {
7474
TypeDefinitionRegistry typeDefinitionRegistry = new TypeDefinitionRegistry();
7575
typeDefinitionRegistry.merge(loadSchemaDefinitionFile("basic.schema.graphqls"));
7676
typeDefinitionRegistry.merge(loadSchemaDefinitionFile("domain.schema.graphqls"));
77+
addCountQueries(typeDefinitionRegistry);
78+
addJsonQueries(typeDefinitionRegistry);
7779
loadAdditionalMutations(typeDefinitionRegistry);
7880

7981
RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring()
@@ -83,6 +85,7 @@ public GraphQLSchema createSchema() {
8385
builder.dataFetcher("ProcessInstances", this::getProcessInstancesValues);
8486
builder.dataFetcher("UserTaskInstances", this::getUserTaskInstancesValues);
8587
builder.dataFetcher("Jobs", this::getJobsValues);
88+
addCountQueries(builder);
8689
return builder;
8790
})
8891
.type("Mutation", builder -> {

data-index/data-index-service/data-index-service-common/src/test/java/org/kie/kogito/index/service/AbstractIndexingServiceIT.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ static void setup() {
114114
@Transactional
115115
void tearDown() {
116116
cacheService.getJobsStorage().clear();
117-
cacheService.getProcessDefinitionStorage().clear();
118117
cacheService.getProcessInstanceStorage().clear();
118+
cacheService.getProcessDefinitionStorage().clear();
119119
cacheService.getUserTaskInstanceStorage().clear();
120120
}
121121

@@ -191,6 +191,9 @@ protected void validateProcessInstance(String query, ProcessInstanceStateDataEve
191191
@Test
192192
void testProcessInstancePagination() {
193193
String processId = "travels";
194+
ProcessDefinitionDataEvent definitionDataEvent = getProcessDefinitionDataEvent(processId);
195+
indexProcessCloudEvent(definitionDataEvent);
196+
validateProcessDefinition(getProcessDefinitionByIdAndVersion(processId, definitionDataEvent.getData().getVersion()), definitionDataEvent);
194197
List<String> pIds = new ArrayList<>();
195198

196199
IntStream.range(0, 100).forEach(i -> {
@@ -230,8 +233,10 @@ void testProcessInstancePagination() {
230233
@Test
231234
void testUserTaskInstancePagination() {
232235
String processId = "deals";
236+
ProcessDefinitionDataEvent definitionDataEvent = getProcessDefinitionDataEvent(processId);
237+
indexProcessCloudEvent(definitionDataEvent);
238+
validateProcessDefinition(getProcessDefinitionByIdAndVersion(processId, definitionDataEvent.getData().getVersion()), definitionDataEvent);
233239
List<String> taskIds = new ArrayList<>();
234-
235240
IntStream.range(0, 100).forEach(i -> {
236241
String taskId = UUID.randomUUID().toString();
237242
UserTaskInstanceStateDataEvent event = getUserTaskCloudEvent(taskId, processId, UUID.randomUUID().toString(), null, null, "InProgress");
@@ -286,6 +291,9 @@ void testUserTaskInstancePagination() {
286291
@Test
287292
void testConcurrentProcessInstanceIndex() throws Exception {
288293
String processId = "travels";
294+
ProcessDefinitionDataEvent definitionDataEvent = getProcessDefinitionDataEvent(processId);
295+
indexProcessCloudEvent(definitionDataEvent);
296+
validateProcessDefinition(getProcessDefinitionByIdAndVersion(processId, definitionDataEvent.getData().getVersion()), definitionDataEvent);
289297
ExecutorService executorService = new ScheduledThreadPoolExecutor(8);
290298
int max_instance_events = 10;
291299
List<CompletableFuture<Void>> futures = new ArrayList<>();
@@ -330,6 +338,10 @@ void testProcessInstanceIndex() throws Exception {
330338
indexProcessCloudEvent(definitionDataEvent);
331339
validateProcessDefinition(getProcessDefinitionByIdAndVersion(processId, definitionDataEvent.getData().getVersion()), definitionDataEvent);
332340

341+
ProcessDefinitionDataEvent subProcessdefinitionDataEvent = getProcessDefinitionDataEvent(subProcessId);
342+
indexProcessCloudEvent(subProcessdefinitionDataEvent);
343+
validateProcessDefinition(getProcessDefinitionByIdAndVersion(subProcessId, subProcessdefinitionDataEvent.getData().getVersion()), subProcessdefinitionDataEvent);
344+
333345
ProcessInstanceStateDataEvent startEvent = getProcessCloudEvent(processId, processInstanceId, ACTIVE, null, null, null, CURRENT_USER);
334346
indexProcessCloudEvent(startEvent);
335347

data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/storage/DataIndexStorageService.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@
1818
*/
1919
package org.kie.kogito.index.storage;
2020

21+
import java.util.EnumSet;
22+
import java.util.Set;
23+
2124
import org.kie.kogito.index.model.Job;
2225
import org.kie.kogito.index.model.ProcessDefinition;
2326
import org.kie.kogito.index.model.ProcessDefinitionKey;
2427
import org.kie.kogito.persistence.api.Storage;
28+
import org.kie.kogito.persistence.api.StorageServiceCapability;
2529

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

2832
public interface DataIndexStorageService {
29-
3033
Storage<ProcessDefinitionKey, ProcessDefinition> getProcessDefinitionStorage();
3134

3235
ProcessInstanceStorage getProcessInstanceStorage();
@@ -40,4 +43,8 @@ public interface DataIndexStorageService {
4043
String getDomainModelCacheName(String processId);
4144

4245
Storage<String, String> getProcessIdModelCache();
46+
47+
default Set<StorageServiceCapability> capabilities() {
48+
return EnumSet.noneOf(StorageServiceCapability.class);
49+
}
4350
}

data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/mapper/ProcessInstanceEntityMapper.java

-7
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,13 @@
1919
package org.kie.kogito.index.jpa.mapper;
2020

2121
import org.kie.kogito.index.jpa.model.MilestoneEntity;
22-
import org.kie.kogito.index.jpa.model.ProcessDefinitionEntity;
2322
import org.kie.kogito.index.jpa.model.ProcessInstanceEntity;
2423
import org.kie.kogito.index.model.Milestone;
25-
import org.kie.kogito.index.model.ProcessDefinition;
2624
import org.kie.kogito.index.model.ProcessInstance;
2725
import org.mapstruct.AfterMapping;
2826
import org.mapstruct.InheritInverseConfiguration;
2927
import org.mapstruct.Mapper;
3028
import org.mapstruct.MappingTarget;
31-
import org.mapstruct.factory.Mappers;
3229

3330
@Mapper(componentModel = "cdi", suppressTimestampInGenerated = true)
3431
public interface ProcessInstanceEntityMapper {
@@ -43,10 +40,6 @@ public interface ProcessInstanceEntityMapper {
4340
@InheritInverseConfiguration
4441
ProcessInstance mapToModel(ProcessInstanceEntity pi);
4542

46-
default ProcessDefinition mapToDefinition(ProcessDefinitionEntity entity) {
47-
return Mappers.getMapper(ProcessDefinitionEntityMapper.class).mapToModel(entity);
48-
}
49-
5043
@AfterMapping
5144
default void afterMapping(@MappingTarget ProcessInstanceEntity entity) {
5245
entity.getNodes().forEach(n -> n.setProcessInstance(entity));

data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceEntity.java

-7
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import java.util.Objects;
2424
import java.util.Set;
2525

26-
import org.hibernate.annotations.NotFound;
27-
import org.hibernate.annotations.NotFoundAction;
2826
import org.kie.kogito.persistence.postgresql.hibernate.JsonBinaryConverter;
2927

3028
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -93,7 +91,6 @@ public class ProcessInstanceEntity extends AbstractEntity {
9391
@ManyToOne(targetEntity = ProcessDefinitionEntity.class, fetch = FetchType.LAZY)
9492
@JoinColumns({ @JoinColumn(name = "processId", referencedColumnName = "id", insertable = false, updatable = false),
9593
@JoinColumn(name = "version", referencedColumnName = "version", insertable = false, updatable = false) })
96-
@NotFound(action = NotFoundAction.IGNORE)
9794
private ProcessDefinitionEntity definition;
9895

9996
@Override
@@ -290,10 +287,6 @@ public int hashCode() {
290287
return Objects.hash(id);
291288
}
292289

293-
public ProcessDefinitionEntity getDefinition() {
294-
return definition;
295-
}
296-
297290
@Override
298291
public String toString() {
299292
return "ProcessInstanceEntity{" +

0 commit comments

Comments
 (0)