Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
44d4737
Scaffold Quarkus backend, Maven wrapper, and Nix dev shell~
thoniTUB Mar 23, 2026
ae0b68a
adds frontend config api
thoniTUB Mar 23, 2026
3e88c46
adds me resource
thoniTUB Mar 23, 2026
d7b3b56
adds dataset endpoint
thoniTUB Mar 23, 2026
9a09a7a
adds entity-preview endpoint
thoniTUB Mar 24, 2026
df3d002
adds concepts endpoint
thoniTUB Mar 24, 2026
14c6e6f
adds form-config endpoint
thoniTUB Mar 24, 2026
3211dd6
adds queries endpoint
thoniTUB Mar 24, 2026
82c5e75
adds endpoint for stored query
thoniTUB Mar 24, 2026
a5f3443
adds post query endpoint
thoniTUB Mar 24, 2026
94a0117
adds query cancel endpoint
thoniTUB Mar 24, 2026
aa1cc6b
adds concept endpoint
thoniTUB Mar 24, 2026
9feeb77
adds discriminators for polymorph query nodes
thoniTUB Apr 7, 2026
0f45684
adds query service
thoniTUB Apr 7, 2026
4d0048b
wire query lifecycle and concept API
thoniTUB Apr 7, 2026
0f606bf
adds concept id resolve
thoniTUB Apr 7, 2026
b069464
adds filter service
thoniTUB Apr 7, 2026
eea2440
smaller openapi fixes
thoniTUB Apr 7, 2026
1f0a048
adds patching of query metadata and deleting
thoniTUB Apr 8, 2026
b746ec9
refactor type discrimination on query submission payload
thoniTUB Apr 8, 2026
ae00d44
adds endpoint for entity upload
thoniTUB Apr 8, 2026
1de6b0f
adds entity enpoints and placeholder logic
thoniTUB Apr 8, 2026
61bbdc3
adds discriminator for filtervalue
thoniTUB Apr 8, 2026
955728e
adds form-config endpoints
thoniTUB Apr 8, 2026
1c2f8dc
adds base for storage abstraction
thoniTUB Apr 9, 2026
e02fef9
adds lombok
thoniTUB Apr 9, 2026
6785bce
adds meta storage facade
thoniTUB Apr 9, 2026
87d3fd2
adds facades for xodus
thoniTUB Apr 17, 2026
6b8982a
adds xodus implementation
thoniTUB Apr 23, 2026
adce5d7
static meta data from folder
thoniTUB Jun 16, 2026
39e749b
work on three stage objects models json/domain/ui for concepts
thoniTUB Jul 6, 2026
0c79642
fix concepts show all tables as connectors
thoniTUB Jul 7, 2026
e551ceb
introduce id system that looks like the old one
thoniTUB Jul 7, 2026
d7c9f29
add concept filter models
thoniTUB Jul 8, 2026
ccfa065
add converter to normalize column and table references in old concepts
thoniTUB Jul 28, 2026
b7e99fa
adds revamped CPSType resolving
thoniTUB Jul 31, 2026
f05fe14
integrate select definitions
thoniTUB Jul 31, 2026
b4c6a34
adds support for structure nodes
thoniTUB Aug 3, 2026
1605b0f
adds validity dates
thoniTUB Aug 3, 2026
f0ed7dd
adds polymorphism for concept conditions
thoniTUB Aug 3, 2026
d12dc31
adds concept selects
thoniTUB Aug 3, 2026
ccb468d
polymorph filtervalues
thoniTUB Aug 3, 2026
01115bc
fix openapi spec for classes annotated with JsonCreator
thoniTUB Aug 3, 2026
ee8d10c
Move polymorphic type definition to definition class
thoniTUB Aug 10, 2026
999fec5
bring back frontend's .env.example
thoniTUB Aug 10, 2026
12bbbec
feat(backend-quarkus): support external model plugins
thoniTUB Aug 24, 2026
e3d0ed5
refactor(backend-quarkus): extract filter plugin API
thoniTUB Aug 24, 2026
39ee3f7
Merge remote-tracking branch 'origin/develop' into feature/quarkus-mi…
thoniTUB Aug 24, 2026
e968158
feat(backend-quarkus): prepare SQL dataset execution
thoniTUB Aug 25, 2026
9454677
Merge remote-tracking branch 'origin/develop' into feature/quarkus-mi…
thoniTUB Aug 25, 2026
9e956fb
feat(sql): introduce resolved query model
thoniTUB Aug 26, 2026
b8c6200
refactor(sql): decouple node conversion dispatch
thoniTUB Aug 26, 2026
7564f1f
Merge remote-tracking branch 'origin/develop' into feature/quarkus-mi…
thoniTUB Aug 27, 2026
3073b6d
feat(sql): define validated resolved operations
thoniTUB Aug 28, 2026
c4d2a97
refactor(quarkus): use shared dataset model
thoniTUB Aug 28, 2026
3404a1a
refactor(sql): separate model and validation packages
thoniTUB Aug 28, 2026
0507290
refactor(sql): separate compiler runtime dependencies
thoniTUB Aug 28, 2026
5299304
refactor(sql): decouple query steps from dialect
thoniTUB Aug 28, 2026
2023d6f
refactor(sql): expose aggregation through compiler dialect
thoniTUB Aug 28, 2026
d58500d
feat(sql): define compiled query output contract
thoniTUB Sep 1, 2026
11fe7b4
feat(sql): define compiler invocation boundary
thoniTUB Sep 1, 2026
6992428
refactor(sql): move select IR contracts into connector
thoniTUB Sep 1, 2026
853475f
refactor(sql): move select IR implementations into connector
thoniTUB Sep 1, 2026
9541ac0
refactor(sql): move date range IR into connector
thoniTUB Sep 1, 2026
e36b10d
refactor(sql): move ID column IR into connector
thoniTUB Sep 1, 2026
d754bb4
refactor(sql): move select projection IR into connector
thoniTUB Sep 1, 2026
af13344
refactor(sql): render select projections in connector
thoniTUB Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,5 @@ tutorial/mimic_iii_demo/data/**
/node_modules
cypress/screenshots/
cypress/videos/

.codex
3 changes: 3 additions & 0 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
distributionType=bin
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,33 @@ configurations, such as:

## Development

### Backend Development

#### Dropwizard backend (current production backend)

From the repository root:

```bash
./mvnw -pl backend -am test
./mvnw -pl executable -am package
java -jar executable/target/conquery.jar standalone <path-to-config.json>
```

#### Quarkus backend (migration target)

From the repository root:

```bash
./mvnw -pl backend-quarkus quarkus:dev
```

Useful endpoints while running:

- `http://localhost:8090/api/ping`
- `http://localhost:8090/api/config/frontend`
- `http://localhost:8090/q/health`
- `http://localhost:8090/q/swagger-ui`

### Testing

#### Integration Tests
Expand Down
23 changes: 23 additions & 0 deletions backend-quarkus-plugin-api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Conquery Quarkus Plugin API

This artifact is the compilation contract for third-party Conquery model plugins. A plugin should depend on
`backend-quarkus-plugin-api` with Maven scope `provided`; it must not depend on the `backend-quarkus` application.

The current stable surface covers metadata filters:

- `FilterDefinition`, `AbstractFilterDefinition`, and `SingleColumnFilterDefinition` describe plugin metadata.
- `FilterDefinitionProvider<T>` is the CDI discovery hook.
- `FilterConversionContext` validates referenced columns without exposing backend repositories or IDs. It returns the
shared `dataset-model` contracts `ColumnDescriptor` and `ColumnType` rather than filter-specific column models.
- `FilterResult` is the implementation-neutral result mapped to the backend catalog by the host.
- `PolymorphicModelSubtype` declares the JSON/OpenAPI discriminator.

Use frontend filter-value discriminator IDs such as `STRING` in `acceptedValueTypes()`. Include a Jandex index in the
plugin JAR. The complete development, installation, reaugmentation, and test workflow is documented in
[`backend-quarkus/README.md`](../backend-quarkus/README.md#polymorphic-model-plugins).

Query filter-value, select, and condition contracts have not yet been extracted into this artifact and should be
considered provisional.

The plugin API exposes `dataset-model` transitively because dataset vocabulary is part of its public signatures. Plugin
code imports those types from `com.bakdata.conquery.models.datasets`; it does not need a second explicit dependency.
57 changes: 57 additions & 0 deletions backend-quarkus-plugin-api/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.bakdata.conquery</groupId>
<artifactId>parent</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>backend-quarkus-plugin-api</artifactId>
<name>Conquery Quarkus Plugin API</name>

<dependencies>
<dependency>
<groupId>com.bakdata.conquery</groupId>
<artifactId>dataset-model</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.18.3</version>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile.openapi</groupId>
<artifactId>microprofile-openapi-api</artifactId>
<version>4.0.2</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>make-index</id>
<goals>
<goal>jandex</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class AbstractFilterDefinition implements FilterDefinition {

@Schema(description = "Filter implementation discriminator.")
private String type;
@Schema(description = "Stable local name used to form the filter id. Falls back to the label when omitted.", pattern = "^\\w+$")
private String name;
@Schema(description = "Label displayed to users.")
private String label;
@JsonAlias("description")
@Schema(description = "Additional explanation displayed for the filter.")
private String tooltip;
@Schema(description = "Unit displayed with filter values.")
private String unit;
@Schema(description = "Optional input validation pattern.")
private String pattern;
@Schema(description = "Whether values may be supplied using a dropped file.")
private Boolean allowDropFile;
@Schema(description = "Default frontend value.")
private Object defaultValue;
@Schema(description = "Optional minimum frontend value.")
private Integer min;
@Schema(description = "Optional maximum frontend value.")
private Integer max;

public String getType() { return type; }
public void setType(String type) { this.type = type; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getLabel() { return label; }
public void setLabel(String label) { this.label = label; }
public String getTooltip() { return tooltip; }
public void setTooltip(String tooltip) { this.tooltip = tooltip; }
public String getUnit() { return unit; }
public void setUnit(String unit) { this.unit = unit; }
public String getPattern() { return pattern; }
public void setPattern(String pattern) { this.pattern = pattern; }
public Boolean getAllowDropFile() { return allowDropFile; }
public void setAllowDropFile(Boolean allowDropFile) { this.allowDropFile = allowDropFile; }
public Object getDefaultValue() { return defaultValue; }
public void setDefaultValue(Object defaultValue) { this.defaultValue = defaultValue; }
public Integer getMin() { return min; }
public void setMin(Integer min) { this.min = min; }
public Integer getMax() { return max; }
public void setMax(Integer max) { this.max = max; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import com.bakdata.conquery.models.datasets.ColumnDescriptor;

/** Host services available while converting a plugin filter definition. */
public interface FilterConversionContext {

/** Selects a stable local ID component and reports sanitized fallbacks through the host. */
String idPartFromPreferredOrFallback(String preferred, String fallback, String idType, Object fallbackContext);

/**
* Resolves and validates a local connector-table column.
*
* @throws IllegalArgumentException when the name is invalid or the column does not exist
*/
ColumnDescriptor requireColumn(String columnName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import com.bakdata.conquery.quarkus.plugin.api.models.PolymorphicModelBase;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
visible = true,
defaultImpl = UnknownFilterDefinition.class
)
@Schema(name = "MetadataFilterDefinition", description = "Filter definition used in connector metadata. The concrete model is selected by `type`.", discriminatorProperty = "type")
@PolymorphicModelBase(
schemaName = "MetadataFilterDefinition",
description = "Filter definition used in connector metadata. The concrete model is selected by `type`."
)
public interface FilterDefinition {

String getType();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import java.util.Set;

import com.bakdata.conquery.quarkus.plugin.api.models.PolymorphicModelTypeProvider;

/**
* CDI discovery and conversion contract for one metadata filter model.
*
* @param <T> concrete, annotated filter definition contributed by the plugin
*/
public interface FilterDefinitionProvider<T extends FilterDefinition> extends PolymorphicModelTypeProvider<FilterDefinition, T> {

default String type() {
return typeId();
}

/**
* Declares the frontend filter-value discriminator IDs emitted by this provider.
*
* @return non-empty set of registered IDs such as {@code STRING} or {@code INTEGER_RANGE}
*/
Set<String> acceptedValueTypes();

/**
* Converts validated plugin metadata into an implementation-neutral filter description.
*/
FilterResult convert(FilterConversionContext context, T payload);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import java.util.List;

/**
* Backend-independent filter description emitted by a plugin provider.
*
* <p>Required columns are local names. The host validates them again and creates its own IDs and repository records.</p>
*/
public record FilterResult(
String name,
String label,
String valueType,
String unit,
String tooltip,
List<Option> options,
Integer min,
Integer max,
String pattern,
boolean allowDropFile,
boolean creatable,
Object defaultValue,
List<String> requiredColumns
) {
public FilterResult {
options = options == null ? List.of() : List.copyOf(options);
requiredColumns = requiredColumns == null ? List.of() : List.copyOf(requiredColumns);
}

public record Option(String value, String label, String optionValue) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import jakarta.validation.constraints.NotBlank;
import org.eclipse.microprofile.openapi.annotations.media.Schema;

/** Convenience base for filter definitions referencing one local connector-table column. */
public abstract class SingleColumnFilterDefinition extends AbstractFilterDefinition {

@NotBlank
@Schema(description = "Local name of a column in the connector table.", required = true, pattern = "^\\w+$")
private String column;

public String getColumn() {
return column;
}

public void setColumn(String column) {
this.column = column;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.bakdata.conquery.quarkus.plugin.api.filters;

import java.util.LinkedHashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;

public final class UnknownFilterDefinition implements FilterDefinition {

private String type;
private final Map<String, Object> properties = new LinkedHashMap<>();

@Override
public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

@JsonAnySetter
public void put(String name, Object value) {
properties.put(name, value);
}

@JsonAnyGetter
public Map<String, Object> properties() {
return Map.copyOf(properties);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* Stable compilation contracts for metadata filter plugins.
*
* <p>Plugins provide a model and CDI {@link com.bakdata.conquery.quarkus.plugin.api.filters.FilterDefinitionProvider}
* without depending on backend implementation classes.</p>
*/
package com.bakdata.conquery.quarkus.plugin.api.filters;
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.bakdata.conquery.quarkus.plugin.api.models;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PolymorphicModelBase {
String discriminator() default "type";
String schemaName();
String description() default "";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.bakdata.conquery.quarkus.plugin.api.models;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/** Declares the serialized identity of a concrete plugin model. */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PolymorphicModelSubtype {
Class<?> base();
String id();
}
Loading
Loading