Skip to content

WIP [NAE-1997] Query language #284

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 27 commits into
base: release/8.0.0
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
cd448cd
[NAE-1997] Query language
MartinSiran Jul 31, 2024
c4d2cb7
[NAE-1997] Query language
MartinSiran Jul 31, 2024
8f1f20b
[NAE-1997] Query language
MartinSiran Aug 2, 2024
a48e586
[NAE-1997] Query language
MartinSiran Aug 5, 2024
0a38365
[NAE-1997] Query language
MartinSiran Aug 13, 2024
b0718af
[NAE-1997] Query language
MartinSiran Aug 14, 2024
aecbe37
[NAE-1997] Query language
MartinSiran Aug 16, 2024
d9bc81f
[NAE-1997] Query language
MartinSiran Aug 19, 2024
c65c527
[NAE-1997] Query language
MartinSiran Aug 20, 2024
2ec9050
[NAE-1997] Query language
MartinSiran Aug 22, 2024
54f7157
[NAE-1997] Query language
MartinSiran Sep 2, 2024
7dc80e3
[NAE-1997] Query language
MartinSiran Jan 29, 2025
1ab4640
[NAE-1997] Query language
MartinSiran Jan 30, 2025
863990f
[NAE-1997] Query language
MartinSiran Jan 31, 2025
f1d5cfb
[NAE-1997] Query language
MartinSiran Feb 3, 2025
e40dbf1
[NAE-1997] Query language
MartinSiran Feb 5, 2025
0a0a8ce
[NAE-1997] Query language
MartinSiran Feb 14, 2025
ff592f5
[NAE-1997] Query language
MartinSiran Feb 17, 2025
88c9f20
[NAE-1997] Query language
MartinSiran Feb 26, 2025
87a47c4
[NAE-1997] Query language
MartinSiran Mar 5, 2025
2d33449
[NAE-1997] Query language
MartinSiran Mar 5, 2025
e71db6d
[NAE-1997] Query language
MartinSiran Mar 5, 2025
127a4db
[NAE-1997] Query language
MartinSiran Mar 10, 2025
cee6e36
[NAE-1997] Query language
MartinSiran Mar 10, 2025
2bb49aa
[NAE-1997] Query language
MartinSiran Mar 12, 2025
0fe0a5b
[NAE-1997] Query language
MartinSiran Mar 12, 2025
b1e0788
[NAE-1997] Query language
MartinSiran Mar 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
<drools.version>7.70.0.Final</drools.version>
<sonar.organization>netgrif-oss</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<antlr4.version>4.13.1</antlr4.version>
</properties>

<repositories>
Expand Down Expand Up @@ -505,6 +506,14 @@
<artifactId>jackson-module-jsonSchema</artifactId>
<version>2.13.2</version>
</dependency>

<!-- ANTLR (query language) -->
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>${antlr4.version}</version>
</dependency>

</dependencies>

<build>
Expand Down Expand Up @@ -779,6 +788,22 @@
<artifactId>license-maven-plugin</artifactId>
<version>2.0.0</version>
</plugin>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>${antlr4.version}</version>
<configuration>
<sourceDirectory>src/main/java</sourceDirectory>
<outputDirectory>${project.build.directory}/generated-sources/java/</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import com.netgrif.application.engine.petrinet.domain.version.Version
import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService
import com.netgrif.application.engine.petrinet.service.interfaces.IUriService
import com.netgrif.application.engine.rules.domain.RuleRepository
import com.netgrif.application.engine.search.interfaces.ISearchService
import com.netgrif.application.engine.startup.DefaultFiltersRunner
import com.netgrif.application.engine.startup.FilterRunner
import com.netgrif.application.engine.utils.FullPageRequest
Expand Down Expand Up @@ -177,6 +178,9 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ {
@Autowired
PublicViewProperties publicViewProperties

@Autowired
ISearchService searchService

FrontendActionOutcome Frontend

/**
Expand Down Expand Up @@ -2321,4 +2325,20 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ {
Case taskCase = workflowService.findOne(task.caseId)
return taskCase.getPetriNet().getDataSet().get(fieldId)
}

String explainQuery(String query) {
return searchService.explainQuery(query)
}

long count(String query) {
return searchService.count(query)
}

def search(String query) {
return searchService.search(query)
}

boolean exists(String query) {
return searchService.exists(query)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,9 @@ public class ElasticCase {

private Map<String, DataField> dataSet;

@Field(type = Keyword)
private Set<String> taskIds;
private Map<String, Task> tasks;

@Field(type = Keyword)
private Set<String> taskMongoIds;
private Map<String, Place> places;

@Field(type = Keyword)
private Set<String> enabledRoles;
Expand Down Expand Up @@ -126,8 +124,6 @@ public ElasticCase(Case useCase) {
author = useCase.getAuthor().getId();
authorName = useCase.getAuthor().getFullName();
authorEmail = useCase.getAuthor().getEmail();
taskIds = useCase.getTasks().keySet();
taskMongoIds = useCase.getTasks().values().stream().map(TaskPair::getTaskStringId).collect(Collectors.toSet());
enabledRoles = new HashSet<>(useCase.getEnabledRoles());
viewRoles = new HashSet<>(useCase.getViewRoles());
viewUserRefs = new HashSet<>(useCase.getViewUserRefs());
Expand All @@ -137,6 +133,17 @@ public ElasticCase(Case useCase) {
tags = new HashMap<>(useCase.getTags());

dataSet = new HashMap<>();

tasks = useCase.getTasks().entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> new Task(entry.getValue().getTaskStringId(), entry.getValue().getState(), entry.getValue().getUserId())
));
places = useCase.getActivePlaces().entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> new Place(entry.getValue())
));
}

public void update(ElasticCase useCase) {
Expand All @@ -146,8 +153,6 @@ public void update(ElasticCase useCase) {
uriNodeId = useCase.getUriNodeId();
}
title = useCase.getTitle();
taskIds = useCase.getTaskIds();
taskMongoIds = useCase.getTaskMongoIds();
enabledRoles = useCase.getEnabledRoles();
viewRoles = useCase.getViewRoles();
viewUserRefs = useCase.getViewUserRefs();
Expand All @@ -157,5 +162,7 @@ public void update(ElasticCase useCase) {
tags = useCase.getTags();

dataSet = useCase.getDataSet();
tasks = useCase.getTasks();
places = useCase.getPlaces();
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.netgrif.application.engine.elastic.domain;

import com.netgrif.application.engine.petrinet.domain.I18nString;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Field;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;

import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword;

Expand All @@ -20,17 +18,21 @@ public class MapField extends TextField {
@Field(type = Keyword)
public List<String> keyValue = new ArrayList<>();

public MapField(String key, List<String> values) {
public List<String> options = new ArrayList<>();

public MapField(String key, List<String> values, Map<String, I18nString> options) {
super(values);
this.keyValue.add(key);
this.options.addAll(options.keySet());
}

public MapField(Map<String, List<String>> valuePairs) {
public MapField(Map<String, List<String>> valuePairs, Map<String, I18nString> options) {
super();
valuePairs.forEach((key, value) -> {
this.keyValue.add(key);
this.textValue.addAll(value);
this.fulltextValue.addAll(value);
});
this.options.addAll(options.keySet());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.netgrif.application.engine.elastic.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Field;

import static org.springframework.data.elasticsearch.annotations.FieldType.Integer;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;

@Data
@NoArgsConstructor
@EqualsAndHashCode
@AllArgsConstructor
public class Place {

@Field(type = Integer)
public Integer marking;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.netgrif.application.engine.elastic.domain;

import com.netgrif.application.engine.workflow.domain.State;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Field;

import static org.springframework.data.elasticsearch.annotations.FieldType.Text;

@Data
@NoArgsConstructor
@EqualsAndHashCode
@AllArgsConstructor
public class Task {

@Field(type = Text)
public String stringId;

@Field(type = Text)
public State state;

@Field(type = Text)
public String userId;

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public MapField transform(EnumerationMapField caseField, EnumerationMapField pet
DataFieldValue<String> selectedKey = caseField.getValue();
String value = selectedKey != null ? selectedKey.getValue() : null;
I18nString selectedValue = options.get(value) != null ? options.get(value) : new I18nString();
return new MapField(value, selectedValue.collectTranslations());
return new MapField(value, selectedValue.collectTranslations(), caseField.getOptions());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public MapField transform(MultichoiceMapField caseField, MultichoiceMapField pet
I18nString selectedValue = options.get(value) != null ? options.get(value) : new I18nString();
fieldValues.put(value, selectedValue.collectTranslations());
}
return new MapField(fieldValues);
return new MapField(fieldValues, options);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.netgrif.application.engine.search;

import lombok.Getter;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.ParseCancellationException;

import java.util.ArrayList;
import java.util.List;

@Getter
public class QueryLangErrorListener extends BaseErrorListener {
List<String> errorMessages = new ArrayList<>();

@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e)
throws ParseCancellationException {
errorMessages.add(underlineError(recognizer, (Token) offendingSymbol, line, charPositionInLine, msg));
}

protected String underlineError(Recognizer<?, ?> recognizer, Token offendingToken, int line, int charPositionInLine, String msg) {
String underlineErrorMsg = msg + "\n";
int start = offendingToken.getStartIndex();
int stop = offendingToken.getStopIndex();
if (start > stop) {
return underlineErrorMsg;
}
CommonTokenStream tokens = (CommonTokenStream) recognizer.getInputStream();
String input = tokens.getTokenSource().getInputStream().toString();
String[] lines = input.split("\n");
String errorLine = lines[line - 1];
underlineErrorMsg += errorLine + "\n";
underlineErrorMsg += " ".repeat(charPositionInLine) + "^".repeat(stop - start + 1) + "\n";

return underlineErrorMsg;
}
}
Loading
Loading