Skip to content

Commit 007b104

Browse files
committed
using querydsl for the search
1 parent e76f7d3 commit 007b104

32 files changed

+510
-281
lines changed

core/pom.xml

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,21 @@
2525
<groupId>org.springframework.boot</groupId>
2626
<artifactId>spring-boot-starter-data-jpa</artifactId>
2727
</dependency>
28+
29+
<dependency>
30+
<groupId>com.querydsl</groupId>
31+
<artifactId>querydsl-apt</artifactId>
32+
<version>${querydsl.version}</version>
33+
<classifier>jakarta</classifier>
34+
<scope>provided</scope>
35+
</dependency>
36+
<dependency>
37+
<groupId>com.querydsl</groupId>
38+
<artifactId>querydsl-jpa</artifactId>
39+
<version>${querydsl.version}</version>
40+
<classifier>jakarta</classifier>
41+
</dependency>
42+
2843
<dependency>
2944
<groupId>org.springframework.boot</groupId>
3045
<artifactId>spring-boot-starter-validation</artifactId>
@@ -38,6 +53,12 @@
3853
<artifactId>liquibase-core</artifactId>
3954
</dependency>
4055

56+
<dependency>
57+
<groupId>com.github.f4b6a3</groupId>
58+
<artifactId>uuid-creator</artifactId>
59+
<version>6.1.1</version>
60+
</dependency>
61+
4162
<dependency>
4263
<groupId>org.springframework.boot</groupId>
4364
<artifactId>spring-boot-devtools</artifactId>
@@ -52,11 +73,6 @@
5273
<scope>test</scope>
5374
</dependency>
5475

55-
<dependency>
56-
<groupId>org.liquibase</groupId>
57-
<artifactId>liquibase-core</artifactId>
58-
<scope>test</scope>
59-
</dependency>
6076
<dependency>
6177
<groupId>com.h2database</groupId>
6278
<artifactId>h2</artifactId>
@@ -186,12 +202,15 @@
186202
</customTypeMappings>
187203
<classes>
188204
<class>org.springframework.data.web.PagedModel</class>
189-
<class>
190-
org.sterl.spring.persistent_tasks.scheduler.entity.SchedulerEntity</class>
205+
<class>org.sterl.spring.persistent_tasks.scheduler.entity.SchedulerEntity</class>
191206
</classes>
192207
<classPatterns>
193-
<pattern>org.sterl.spring.persistent_tasks.api.**</pattern>
208+
<pattern>org.sterl.spring.persistent_tasks.api.*</pattern>
194209
</classPatterns>
210+
<excludeClassPatterns>
211+
<pattern>com.querydsl.core.types.dsl.**</pattern>
212+
<pattern>java.lang.reflect.**</pattern>
213+
</excludeClassPatterns>
195214
<outputFile>../ui/src/server-api.d.ts</outputFile>
196215
<outputKind>module</outputKind>
197216
</configuration>

core/src/main/java/org/sterl/spring/persistent_tasks/PersistentTaskService.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
import java.util.List;
88
import java.util.Optional;
99

10+
import org.apache.commons.lang3.StringUtils;
1011
import org.springframework.context.event.EventListener;
1112
import org.springframework.data.domain.PageRequest;
1213
import org.springframework.data.domain.Pageable;
13-
import org.springframework.data.domain.Sort;
1414
import org.springframework.data.domain.Sort.Direction;
1515
import org.springframework.lang.NonNull;
1616
import org.springframework.stereotype.Service;
1717
import org.springframework.transaction.annotation.Transactional;
1818
import org.sterl.spring.persistent_tasks.api.AddTriggerRequest;
1919
import org.sterl.spring.persistent_tasks.api.TriggerKey;
20+
import org.sterl.spring.persistent_tasks.api.TriggerSearch;
2021
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
2122
import org.sterl.spring.persistent_tasks.history.HistoryService;
2223
import org.sterl.spring.persistent_tasks.history.model.TriggerHistoryLastStateEntity;
@@ -132,38 +133,37 @@ public <T extends Serializable> TriggerKey runOrQueue(
132133
*/
133134
@Transactional(readOnly = true, timeout = 5)
134135
public List<TriggerData> findAllTriggerByCorrelationId(String correlationId) {
136+
if (StringUtils.isAllBlank(correlationId)) return Collections.emptyList();
137+
138+
final var search = TriggerSearch.byCorrelationId(correlationId);
135139

136-
var running = triggerService.findTriggerByCorrelationId(correlationId, Pageable.ofSize(100))
140+
final var running = triggerService.searchTriggers(search, PageRequest.of(0, 100, TriggerSearch.DEFAULT_SORT))
137141
.stream().map(TriggerEntity::getData)
138142
.toList();
139143

140-
var done = historyService.findTriggerByCorrelationId(correlationId, Pageable.ofSize(200))
144+
final var done = historyService.searchTriggers(search, PageRequest.of(0, 200, TriggerSearch.DEFAULT_SORT))
141145
.stream().map(TriggerHistoryLastStateEntity::getData)
142146
.toList();
143147

144-
var result = new ArrayList<TriggerData>(running.size() + done.size());
148+
final var result = new ArrayList<TriggerData>(running.size() + done.size());
145149
result.addAll(done);
146150
result.addAll(running);
147151
return result;
148152
}
149-
150-
/**
151-
* Returns the first info to a trigger based on the correlationId.
152-
*
153-
* @param correlationId the id to search for
154-
* @return the found {@link TriggerData}
155-
*/
153+
156154
@Transactional(readOnly = true, timeout = 5)
157155
public Optional<TriggerData> findLastTriggerByCorrelationId(String correlationId) {
158-
final var page = PageRequest.of(0, 1, Sort.by(Direction.DESC, "data.createdTime"));
159-
var result = triggerService.findTriggerByCorrelationId(correlationId, page)
160-
.stream().map(TriggerEntity::getData)
161-
.toList();
156+
final var page = PageRequest.of(0, 1, TriggerSearch.sortByCreatedTime(Direction.DESC));
157+
final var search = TriggerSearch.byCorrelationId(correlationId);
158+
159+
var result = triggerService.searchTriggers(search, page)
160+
.stream().map(TriggerEntity::getData)
161+
.toList();
162162

163163
if (result.isEmpty()) {
164-
result = historyService.findTriggerByCorrelationId(correlationId, page)
165-
.stream().map(TriggerHistoryLastStateEntity::getData)
166-
.toList();
164+
result = historyService.searchTriggers(search, page)
165+
.stream().map(TriggerHistoryLastStateEntity::getData)
166+
.toList();
167167
}
168168
return result.isEmpty() ? Optional.empty() : Optional.of(result.getFirst());
169169
}

core/src/main/java/org/sterl/spring/persistent_tasks/api/AddTriggerRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public record AddTriggerRequest<T extends Serializable>(
1515
T state,
1616
OffsetDateTime runtAt,
1717
int priority,
18-
String correlationId) {
18+
String correlationId,
19+
String tag) {
1920

2021
@SuppressWarnings("unchecked")
2122
public TaskId<T> taskId() {

core/src/main/java/org/sterl/spring/persistent_tasks/api/TaskId.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public static class TriggerBuilder<T extends Serializable> {
3434
private final TaskId<T> taskId;
3535
private String id;
3636
private String correlationId;
37+
private String tag;
3738
private T state;
3839
private OffsetDateTime when = OffsetDateTime.now();
3940
private int priority = AddTriggerRequest.DEFAULT_PRIORITY;
@@ -46,7 +47,7 @@ public static <T extends Serializable> TriggerBuilder<T> newTrigger(String name,
4647
}
4748
public AddTriggerRequest<T> build() {
4849
var key = TriggerKey.of(id, taskId);
49-
return new AddTriggerRequest<>(key, state, when, priority, correlationId);
50+
return new AddTriggerRequest<>(key, state, when, priority, correlationId, tag);
5051
}
5152
/**
5253
* The ID of this task, same queued ids are replaced.
@@ -63,6 +64,10 @@ public TriggerBuilder<T> correlationId(String correlationId) {
6364
this.correlationId = correlationId;
6465
return this;
6566
}
67+
public TriggerBuilder<T> tag(String tag) {
68+
this.tag = tag;
69+
return this;
70+
}
6671
public TriggerBuilder<T> state(T state) {
6772
this.state = state;
6873
return this;
@@ -88,6 +93,9 @@ public TriggerBuilder<T> runAt(OffsetDateTime when) {
8893
this.when = when;
8994
return this;
9095
}
96+
/**
97+
* synonym for {@link #runAt(OffsetDateTime)}
98+
*/
9199
public TriggerBuilder<T> runAfter(Duration duration) {
92100
runAt(OffsetDateTime.now().plus(duration));
93101
return this;

core/src/main/java/org/sterl/spring/persistent_tasks/api/Trigger.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public class Trigger {
1515
/** the business key which is unique it is combination for triggers but not the history! */
1616
private TriggerKey key;
1717

18+
private String tag;
19+
1820
private String correlationId;
1921

2022
private String runningOn;

core/src/main/java/org/sterl/spring/persistent_tasks/api/TriggerKey.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
import java.io.Serializable;
44
import java.time.OffsetDateTime;
5-
import java.util.UUID;
65

76
import org.springframework.lang.Nullable;
87

8+
import com.github.f4b6a3.uuid.UuidCreator;
9+
910
import lombok.AllArgsConstructor;
1011
import lombok.Builder;
1112
import lombok.Data;
@@ -29,7 +30,7 @@ public class TriggerKey implements Serializable {
2930
private String taskName;
3031

3132
public static TriggerKey of(@Nullable String id, TaskId<? extends Serializable> taskId) {
32-
return new TriggerKey(id == null ? UUID.randomUUID().toString() : id, taskId.name());
33+
return new TriggerKey(id == null ? UuidCreator.getTimeOrderedEpochFast().toString() : id, taskId.name());
3334
}
3435

3536
public TaskId<Serializable> toTaskId() {
@@ -40,7 +41,7 @@ public TaskId<Serializable> toTaskId() {
4041
* Builds a trigger for the given persistentTask name
4142
*/
4243
public TriggerKey(String taskName) {
43-
id = UUID.randomUUID().toString();
44+
id = UuidCreator.getTimeOrderedEpochFast().toString();
4445
this.taskName = taskName;
4546
}
4647

@@ -52,7 +53,7 @@ public <T extends Serializable> AddTriggerRequest<T> newTrigger(TaskId<T> taskId
5253
}
5354

5455
public <T extends Serializable> AddTriggerRequest<T> newTrigger(TaskId<T> taskId, T state) {
55-
return newTrigger(UUID.randomUUID().toString(), taskId, state);
56+
return newTrigger(UuidCreator.getTimeOrderedEpochFast().toString(), taskId, state);
5657
}
5758

5859
public <T extends Serializable> AddTriggerRequest<T> newTrigger(String id, TaskId<T> taskId, T state) {
@@ -64,6 +65,6 @@ public <T extends Serializable> AddTriggerRequest<T> newTrigger(String id, TaskI
6465
.id(id) //
6566
.state(state) //
6667
.when(when) //
67-
.build();
68+
.build(); //
6869
}
6970
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.sterl.spring.persistent_tasks.api;
2+
3+
import org.springframework.data.domain.PageRequest;
4+
import org.springframework.data.domain.Pageable;
5+
import org.springframework.data.domain.Sort;
6+
import org.springframework.data.domain.Sort.Direction;
7+
import org.sterl.spring.persistent_tasks.shared.StringHelper;
8+
9+
import lombok.Data;
10+
11+
@Data
12+
public class TriggerSearch {
13+
private String search;
14+
private String keyId;
15+
private String taskName;
16+
private String correlationId;
17+
private TriggerStatus status;
18+
private String tag;
19+
20+
public boolean hasValue() {
21+
return StringHelper.hasValue(search)
22+
|| StringHelper.hasValue(keyId)
23+
|| StringHelper.hasValue(taskName)
24+
|| StringHelper.hasValue(tag)
25+
|| status != null;
26+
}
27+
28+
/** create time ASC */
29+
public static final Sort DEFAULT_SORT = sortByCreatedTime(Direction.ASC);
30+
31+
public static Sort sortByCreatedTime(Direction direction) {
32+
return Sort.by(direction, "data.createdTime");
33+
}
34+
public static Pageable applyDefaultSortIfNeeded(Pageable page) {
35+
var result = page;
36+
if (page.getSort() == Sort.unsorted()) {
37+
result = PageRequest.of(page.getPageNumber(), page.getPageSize(), DEFAULT_SORT);
38+
}
39+
return result;
40+
}
41+
public static TriggerSearch byCorrelationId(String correlationId) {
42+
var result = new TriggerSearch();
43+
result.setCorrelationId(correlationId);
44+
return result;
45+
}
46+
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/HistoryService.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313
import org.springframework.lang.Nullable;
1414
import org.sterl.spring.persistent_tasks.api.TaskStatusHistoryOverview;
1515
import org.sterl.spring.persistent_tasks.api.TriggerKey;
16+
import org.sterl.spring.persistent_tasks.api.TriggerSearch;
1617
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
1718
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
19+
import org.sterl.spring.persistent_tasks.history.model.QTriggerHistoryLastStateEntity;
1820
import org.sterl.spring.persistent_tasks.history.model.TriggerHistoryDetailEntity;
1921
import org.sterl.spring.persistent_tasks.history.model.TriggerHistoryLastStateEntity;
2022
import org.sterl.spring.persistent_tasks.history.repository.TriggerHistoryDetailRepository;
2123
import org.sterl.spring.persistent_tasks.history.repository.TriggerHistoryLastStateRepository;
22-
import org.sterl.spring.persistent_tasks.shared.StringHelper;
2324
import org.sterl.spring.persistent_tasks.shared.stereotype.TransactionalService;
2425

2526
import lombok.RequiredArgsConstructor;
@@ -97,16 +98,21 @@ public long countTriggers(TriggerKey key) {
9798
* @param page page informations
9899
* @return the found data, looking only the last states
99100
*/
100-
public Page<TriggerHistoryLastStateEntity> findTriggerState(
101-
@Nullable TriggerKey key, @Nullable TriggerStatus status, Pageable page) {
101+
public Page<TriggerHistoryLastStateEntity> searchTriggers(
102+
@Nullable TriggerSearch search, Pageable page) {
102103

103104
page = applyDefaultSortIfNeeded(page);
104-
if (key == null && status == null) {
105-
return triggerHistoryLastStateRepository.findAll(page);
105+
Page<TriggerHistoryLastStateEntity> result;
106+
107+
if (search != null && search.hasValue()) {
108+
var p = triggerHistoryLastStateRepository.buildSearch(
109+
QTriggerHistoryLastStateEntity.triggerHistoryLastStateEntity.data,
110+
search);
111+
result = triggerHistoryLastStateRepository.findAll(p, page);
112+
} else {
113+
result = triggerHistoryLastStateRepository.findAll(page);
106114
}
107-
final var id = StringHelper.applySearchWildCard(key);
108-
final var name = key == null ? null : key.getTaskName();
109-
return triggerHistoryLastStateRepository.findAll(id, name, status, page);
115+
return result;
110116
}
111117

112118
private Pageable applyDefaultSortIfNeeded(Pageable page) {
@@ -120,8 +126,4 @@ private Pageable applyDefaultSortIfNeeded(Pageable page) {
120126
public List<TaskStatusHistoryOverview> taskStatusHistory() {
121127
return triggerHistoryLastStateRepository.listTriggerStatus();
122128
}
123-
124-
public List<TriggerHistoryLastStateEntity> findTriggerByCorrelationId(String correlationId, Pageable page) {
125-
return triggerHistoryLastStateRepository.findByCorrelationId(correlationId, page);
126-
}
127129
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/api/TriggerHistoryResource.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.time.OffsetDateTime;
44
import java.util.List;
55

6-
import org.apache.commons.lang3.StringUtils;
76
import org.springframework.data.domain.Pageable;
87
import org.springframework.data.web.PageableDefault;
98
import org.springframework.data.web.PagedModel;
@@ -12,12 +11,11 @@
1211
import org.springframework.web.bind.annotation.PathVariable;
1312
import org.springframework.web.bind.annotation.PostMapping;
1413
import org.springframework.web.bind.annotation.RequestMapping;
15-
import org.springframework.web.bind.annotation.RequestParam;
1614
import org.springframework.web.bind.annotation.RestController;
1715
import org.sterl.spring.persistent_tasks.api.TaskStatusHistoryOverview;
1816
import org.sterl.spring.persistent_tasks.api.Trigger;
1917
import org.sterl.spring.persistent_tasks.api.TriggerKey;
20-
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
18+
import org.sterl.spring.persistent_tasks.api.TriggerSearch;
2119
import org.sterl.spring.persistent_tasks.history.HistoryService;
2220
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromLastTriggerStateEntity;
2321
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromTriggerStateDetailEntity;
@@ -43,14 +41,11 @@ public List<TaskStatusHistoryOverview> taskStatusHistory() {
4341

4442
@GetMapping("history")
4543
public PagedModel<Trigger> list(
46-
@RequestParam(name = "id", required = false) String id,
47-
@RequestParam(name = "taskName", required = false) String taskName,
48-
@RequestParam(name = "status", required = false) TriggerStatus status,
44+
TriggerSearch search,
4945
@PageableDefault(size = 100) Pageable page) {
5046

51-
var key = new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName));
5247
return FromLastTriggerStateEntity.INSTANCE.toPage( //
53-
historyService.findTriggerState(key, status, page));
48+
historyService.searchTriggers(search, page));
5449
}
5550

5651
@PostMapping("history/{id}/re-run")

0 commit comments

Comments
 (0)