feat(jdbc): adapt ui to remove lucene expression

This commit is contained in:
Ludovic DEHON
2022-06-01 13:48:08 +02:00
parent 6ea7118fdf
commit eb8868143b
43 changed files with 616 additions and 291 deletions

View File

@@ -30,6 +30,6 @@ public class PostgresFlowRepository extends AbstractFlowRepository {
@Override
protected Condition findSourceCodeCondition(String query) {
return DSL.condition("source_code @@ TO_TSQUERY('simple', ?)", query);
return this.jdbcRepository.fullTextCondition(Collections.singletonList("FULLTEXT_INDEX(source_code)"), query);
}
}

View File

@@ -1,17 +1,18 @@
package io.kestra.repository.postgres;
import io.kestra.core.models.executions.LogEntry;
import io.kestra.core.models.triggers.Trigger;
import io.kestra.core.repositories.LogRepositoryInterface;
import io.kestra.core.repositories.TriggerRepositoryInterface;
import io.kestra.jdbc.repository.AbstractLogRepository;
import io.kestra.jdbc.repository.AbstractTriggerRepository;
import io.micronaut.context.ApplicationContext;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import org.jooq.Condition;
import org.jooq.impl.DSL;
import org.slf4j.event.Level;
import java.util.Collections;
import java.util.stream.Collectors;
@Singleton
@PostgresRepositoryEnabled
@@ -25,4 +26,15 @@ public class PostgresLogRepository extends AbstractLogRepository implements LogR
protected Condition findCondition(String query) {
return this.jdbcRepository.fullTextCondition(Collections.singletonList("fulltext"), query);
}
@Override
protected Condition minLevel(Level minLevel) {
return DSL.condition("level in (" +
LogEntry
.findLevelsByMin(minLevel)
.stream()
.map(s -> "'" + s + "'::log_level")
.collect(Collectors.joining(", ")) +
")");
}
}

View File

@@ -39,47 +39,49 @@ CREATE TYPE queue_type AS ENUM (
);
CREATE OR REPLACE FUNCTION FULLTEXT_REPLACE(text, text) RETURNS text
AS 'SELECT REGEXP_REPLACE(COALESCE($1, ''''), ''[^a-zA-Z\d:]'', $2, ''g'');'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
RETURNS NULL ON NULL INPUT
RETURN TRIM(BOTH $2 FROM REGEXP_REPLACE(COALESCE($1, ''), '[^a-zA-Z\d:]', $2, 'g'));
CREATE OR REPLACE FUNCTION FULLTEXT_INDEX(text) RETURNS tsvector
AS 'SELECT TO_TSVECTOR(''simple'', FULLTEXT_REPLACE($1, '' '')) || TO_TSVECTOR(''simple'', $1);'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
RETURNS NULL ON NULL INPUT
RETURN TO_TSVECTOR('simple', FULLTEXT_REPLACE($1, ' ')) || TO_TSVECTOR('simple', $1);
CREATE OR REPLACE FUNCTION FULLTEXT_SEARCH(text) RETURNS tsquery
AS 'SELECT TO_TSQUERY(''simple'', FULLTEXT_REPLACE($1, '':* & '') || '':*'');'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
RETURNS NULL ON NULL INPUT
RETURN CASE WHEN FULLTEXT_REPLACE($1, '') = '' THEN TO_TSQUERY('')
ELSE TO_TSQUERY('simple', FULLTEXT_REPLACE($1, ':* & ') || ':*')
END;
CREATE OR REPLACE FUNCTION STATE_FROMTEXT(text) RETURNS state_type
AS 'SELECT CAST($1 AS state_type);'
LANGUAGE SQL
IMMUTABLE;
IMMUTABLE
RETURN CAST($1 AS state_type);
CREATE OR REPLACE FUNCTION LOGLEVEL_FROMTEXT(text) RETURNS log_level
AS 'SELECT CAST($1 AS log_level);'
LANGUAGE SQL
IMMUTABLE;
IMMUTABLE
RETURN CAST($1 AS log_level);
CREATE OR REPLACE FUNCTION PARSE_ISO8601_DATETIME(text) RETURNS timestamp
AS 'SELECT $1::timestamp;'
CREATE OR REPLACE FUNCTION PARSE_ISO8601_DATETIME(text) RETURNS timestamptz
LANGUAGE SQL
IMMUTABLE;
IMMUTABLE
RETURN $1::timestamptz;
CREATE OR REPLACE FUNCTION PARSE_ISO8601_TIMESTAMP(text) RETURNS int
AS 'SELECT EXTRACT(epoch FROM $1::timestamptz AT TIME ZONE ''utc'') ;'
LANGUAGE SQL
IMMUTABLE;
IMMUTABLE
RETURN EXTRACT(epoch FROM $1::timestamptz AT TIME ZONE 'utc');
CREATE OR REPLACE FUNCTION PARSE_ISO8601_DURATION(text) RETURNS interval
AS 'SELECT $1::interval;'
LANGUAGE SQL
IMMUTABLE;
IMMUTABLE
RETURN $1::interval;;
/* ----------------------- queues ----------------------- */
CREATE TABLE queues (
@@ -147,6 +149,7 @@ CREATE TABLE executions (
state_current state_type NOT NULL GENERATED ALWAYS AS (STATE_FROMTEXT(value #>> '{state, current}')) STORED,
state_duration BIGINT NOT NULL GENERATED ALWAYS AS (EXTRACT(MILLISECONDS FROM PARSE_ISO8601_DURATION(value #>> '{state, duration}'))) STORED,
start_date TIMESTAMP NOT NULL GENERATED ALWAYS AS (PARSE_ISO8601_DATETIME(value #>> '{state, startDate}')) STORED,
end_date TIMESTAMP GENERATED ALWAYS AS (PARSE_ISO8601_DATETIME(value #>> '{state, endDate}')) STORED,
fulltext TSVECTOR GENERATED ALWAYS AS (
FULLTEXT_INDEX(CAST(value ->> 'namespace' AS varchar)) ||
FULLTEXT_INDEX(CAST(value ->> 'flowId' AS varchar)) ||
@@ -159,6 +162,7 @@ CREATE INDEX executions_namespace ON executions (namespace);
CREATE INDEX executions_flow_id ON executions (flow_id);
CREATE INDEX executions_state_current ON executions (state_current);
CREATE INDEX executions_start_date ON executions (start_date);
CREATE INDEX executions_end_date ON executions (end_date);
CREATE INDEX executions_state_duration ON executions (state_duration);
CREATE INDEX executions_deleted ON executions (deleted);
CREATE INDEX executions_fulltext ON executions USING GIN (fulltext);
@@ -189,7 +193,7 @@ CREATE TABLE logs (
attempt_number INT GENERATED ALWAYS AS (CAST(value ->> 'attemptNumber' AS INTEGER)) STORED,
trigger_id VARCHAR(150) GENERATED ALWAYS AS (value ->> 'triggerId') STORED,
level log_level NOT NULL GENERATED ALWAYS AS (LOGLEVEL_FROMTEXT(value ->> 'level')) STORED,
timestamp TIMESTAMP NOT NULL GENERATED ALWAYS AS (PARSE_ISO8601_DATETIME(value ->> 'timestamp')) STORED,
timestamp TIMESTAMPTZ NOT NULL GENERATED ALWAYS AS (PARSE_ISO8601_DATETIME(value ->> 'timestamp')) STORED,
fulltext TSVECTOR GENERATED ALWAYS AS (
FULLTEXT_INDEX(CAST(value ->> 'namespace' AS varchar)) ||
FULLTEXT_INDEX(CAST(value ->> 'flowId' AS varchar)) ||

View File

@@ -7,4 +7,6 @@
<appender-ref ref="STDOUT" />
<appender-ref ref="STDERR" />
</root>
<logger name="org.jooq" level="TRACE" />
</configuration>