Skip to content

Commit

Permalink
repo-sqale: massive push in attribute mapping for queries
Browse files Browse the repository at this point in the history
- SimpleItemFilterProcessor#booleanMapper() was added.
- Enum#name() mapped to database enums (convenient and efficient).
  • Loading branch information
virgo47 committed Feb 2, 2021
1 parent d1a648a commit 855621d
Show file tree
Hide file tree
Showing 19 changed files with 187 additions and 38 deletions.
16 changes: 12 additions & 4 deletions repo/repo-sqale/sql/pgnew-repo.sql
Expand Up @@ -15,7 +15,7 @@
-- drop schema public cascade;
CREATE SCHEMA IF NOT EXISTS public;

-- region Functions/triggers
-- region OID-pool table
-- To support gen_random_uuid() pgcrypto extension must be enabled for the database (not for PG 13).
-- select * from pg_available_extensions order by name;
DO $$
Expand All @@ -33,7 +33,9 @@ CREATE TABLE m_object_oid (

CONSTRAINT m_object_oid_pk PRIMARY KEY (oid)
);
-- endregion

-- region Functions/triggers
-- BEFORE INSERT trigger - must be declared on all concrete m_object sub-tables.
CREATE OR REPLACE FUNCTION insert_object_oid()
RETURNS trigger
Expand Down Expand Up @@ -147,6 +149,7 @@ INSERT INTO m_reftype VALUES (11, 'ARCHETYPE');
-- Catalog of used Q-names.
-- Never update values of "uri" manually to change URI for some objects
-- (unless you really want to migrate old URI to a new one).
-- URI format is based on QNameUtil - that is "prefix-url#localPart".
CREATE TABLE m_qname (
id SERIAL,
-- alias VARCHAR(32), -- TODO how to fill it? Perhaps not needed here.
Expand Down Expand Up @@ -796,13 +799,18 @@ CREATE TRIGGER m_connector_host_oid_delete_tr AFTER DELETE ON m_connector_host
CREATE INDEX m_connector_host_name_orig_idx ON m_connector_host (name_orig);
ALTER TABLE m_connector_host ADD CONSTRAINT m_connector_host_name_norm_key UNIQUE (name_norm);

CREATE TYPE TaskExecutionStatusType AS ENUM ('RUNNABLE', 'WAITING', 'SUSPENDED', 'CLOSED');
CREATE TYPE OperationResultStatusType AS ENUM ('SUCCESS', 'WARNING', 'PARTIAL_ERROR',
'FATAL_ERROR', 'HANDLED_ERROR', 'NOT_APPLICABLE', 'IN_PROGRESS', 'UNKNOWN');
CREATE TYPE TaskWaitingReasonType AS ENUM ('OTHER_TASKS', 'OTHER');

CREATE TABLE m_task (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectTypeClass INTEGER GENERATED ALWAYS AS (9) STORED,
binding INTEGER,
category VARCHAR(255),
completionTimestamp TIMESTAMPTZ,
executionStatus INTEGER,
executionStatus TaskExecutionStatusType,
fullResult BYTEA,
handlerUri VARCHAR(255), -- TODO q_name?
lastRunFinishTimestamp TIMESTAMPTZ,
Expand All @@ -816,10 +824,10 @@ CREATE TABLE m_task (
ownerRef_relation_id INTEGER, -- soft-references m_qname
parent VARCHAR(255), -- TODO why not FK?
recurrence INTEGER,
status INTEGER,
resultStatus OperationResultStatusType,
taskIdentifier VARCHAR(255),
threadStopAction INTEGER,
waitingReason INTEGER
waitingReason TaskWaitingReasonType
)
INHERITS (m_object);

Expand Down
Expand Up @@ -34,7 +34,7 @@ public class QConnector extends QObject<MConnector> {
public static final ColumnMetadata FRAMEWORK =
ColumnMetadata.named("framework").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata CONNECTOR_HOST_REF_TARGET_OID =
ColumnMetadata.named("connectorHostRef_targetOid").ofType(UUID_TYPE);
ColumnMetadata.named("connectorHostRef_targetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata CONNECTOR_HOST_REF_TARGET_TYPE =
ColumnMetadata.named("connectorHostRef_targetType").ofType(Types.INTEGER);
public static final ColumnMetadata CONNECTOR_HOST_REF_RELATION_ID =
Expand Down
Expand Up @@ -9,6 +9,7 @@
import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType.*;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObject;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
Expand All @@ -34,8 +35,12 @@ private QConnectorMapping() {
addItemMapping(F_CONNECTOR_TYPE, stringMapper(path(q -> q.connectorType)));
addItemMapping(F_CONNECTOR_VERSION, stringMapper(path(q -> q.connectorVersion)));
addItemMapping(F_FRAMEWORK, stringMapper(path(q -> q.framework)));
addItemMapping(F_CONNECTOR_HOST_REF, RefItemFilterProcessor.mapper(
path(q -> q.connectorHostRefTargetOid),
path(q -> q.connectorHostRefTargetType),
path(q -> q.connectorHostRefRelationId)));

// TODO connector host ref mapping: connectorHostRefTargetOid, connectorHostRefTargetType, connectorHostRefRelationId
// TODO mapping for List<String> F_TARGET_SYSTEM_TYPE
}

@Override
Expand Down
Expand Up @@ -6,12 +6,15 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.focus;

import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;

import java.util.Collection;

import com.querydsl.core.types.Path;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
Expand All @@ -35,8 +38,33 @@ protected QFocusMapping(
@NotNull Class<Q> queryType) {
super(tableName, defaultAliasName, schemaType, queryType);

// addItemMapping(FocusType.F_ACTIVATION, null); // TODO sub-mapping for activation
// TODO mappings
/* addItemMapping(FocusType.F_ACTIVATION, null); // TODO sub-mapping for activation
public final static ItemName F_ADMINISTRATIVE_STATUS = new ItemName(SchemaConstantsGenerated.NS_COMMON, "administrativeStatus");
public final static ItemName F_EFFECTIVE_STATUS = new ItemName(SchemaConstantsGenerated.NS_COMMON, "effectiveStatus");
public final static ItemName F_VALID_FROM = new ItemName(SchemaConstantsGenerated.NS_COMMON, "validFrom");
public final static ItemName F_VALID_TO = new ItemName(SchemaConstantsGenerated.NS_COMMON, "validTo");
public final static ItemName F_VALIDITY_STATUS = new ItemName(SchemaConstantsGenerated.NS_COMMON, "validityStatus");
public final static ItemName F_DISABLE_REASON = new ItemName(SchemaConstantsGenerated.NS_COMMON, "disableReason");
public final static ItemName F_DISABLE_TIMESTAMP = new ItemName(SchemaConstantsGenerated.NS_COMMON, "disableTimestamp");
public final static ItemName F_ENABLE_TIMESTAMP = new ItemName(SchemaConstantsGenerated.NS_COMMON, "enableTimestamp");
public final static ItemName F_ARCHIVE_TIMESTAMP = new ItemName(SchemaConstantsGenerated.NS_COMMON, "archiveTimestamp");
public final static ItemName F_VALIDITY_CHANGE_TIMESTAMP = new ItemName(SchemaConstantsGenerated.NS_COMMON, "validityChangeTimestamp");
// these are not mapped to DB columns so it seems
public final static ItemName F_LOCKOUT_STATUS = new ItemName(SchemaConstantsGenerated.NS_COMMON, "lockoutStatus");
public final static ItemName F_LOCKOUT_EXPIRATION_TIMESTAMP = new ItemName(SchemaConstantsGenerated.NS_COMMON, "lockoutExpirationTimestamp");
*/
addItemMapping(FocusType.F_COST_CENTER, stringMapper(path(q -> q.costCenter)));
addItemMapping(FocusType.F_EMAIL_ADDRESS, stringMapper(path(q -> q.emailAddress)));
// TODO byte[] mapping for F_JPEG_PHOTO -> q.photo
addItemMapping(FocusType.F_LOCALE, stringMapper(path(q -> q.locale)));
addItemMapping(FocusType.F_LOCALITY,
PolyStringItemFilterProcessor.mapper(
path(q -> q.localityOrig), path(q -> q.localityNorm)));
addItemMapping(FocusType.F_PREFERRED_LANGUAGE, stringMapper(path(q -> q.preferredLanguage)));
addItemMapping(FocusType.F_TIMEZONE, stringMapper(path(q -> q.timezone)));
addItemMapping(FocusType.F_TELEPHONE_NUMBER, stringMapper(path(q -> q.telephoneNumber)));
// TODO F_CREDENTIALS mappings to passwordCreateTimestamp+passwordModifyTimestamp
}

@Override
Expand Down
Expand Up @@ -6,7 +6,16 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.lookuptable;

import java.sql.Types;
import java.time.Instant;

import com.querydsl.core.types.dsl.DateTimePath;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.StringPath;
import com.querydsl.sql.ColumnMetadata;

import com.evolveum.midpoint.repo.sqlbase.querydsl.FlexibleRelationalPathBase;
import com.evolveum.midpoint.repo.sqlbase.querydsl.UuidPath;

/**
* Querydsl query type for {@value #TABLE_NAME} table.
Expand All @@ -18,7 +27,29 @@ public class QLookupTableRow extends FlexibleRelationalPathBase<MLookupTableRow>

public static final String TABLE_NAME = "m_lookup_table_row";

// no additional columns and relations
public static final ColumnMetadata OWNER_OID =
ColumnMetadata.named("owner_oid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata ROW_ID =
ColumnMetadata.named("row_id").ofType(Types.INTEGER);
public static final ColumnMetadata ROW_KEY =
ColumnMetadata.named("row_key").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata LABEL_NORM =
ColumnMetadata.named("label_norm").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata LABEL_ORIG =
ColumnMetadata.named("label_orig").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata ROW_VALUE =
ColumnMetadata.named("row_value").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata LAST_CHANGE_TIMESTAMP =
ColumnMetadata.named("lastChangeTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE);

public UuidPath ownerOid = createUuid("", OWNER_OID);
public NumberPath<Integer> rowId = createInteger("rowId", ROW_ID);
public StringPath rowKey = createString("rowKey", ROW_KEY);
public StringPath labelNorm = createString("labelNorm", LABEL_NORM);
public StringPath labelOrig = createString("labelOrig", LABEL_ORIG);
public StringPath rowValue = createString("rowValue", ROW_VALUE);
public DateTimePath<Instant> lastChangeTimestamp =
createInstant("lastChangeTimestamp", LAST_CHANGE_TIMESTAMP);

public QLookupTableRow(String variable) {
this(variable, DEFAULT_SCHEMA_NAME, TABLE_NAME);
Expand Down
Expand Up @@ -6,9 +6,14 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.lookuptable;

import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType.*;

import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.TimestampItemFilterProcessor;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;

/**
Expand All @@ -25,7 +30,12 @@ private QLookupTableRowMapping() {
super(QLookupTableRow.TABLE_NAME, DEFAULT_ALIAS_NAME,
LookupTableRowType.class, QLookupTableRow.class);

// TODO map detail table m_lookup_table_row
addItemMapping(F_KEY, stringMapper(path(q -> q.rowKey)));
addItemMapping(F_LABEL, PolyStringItemFilterProcessor.mapper(
path(q -> q.labelOrig), path(q -> q.labelNorm)));
addItemMapping(F_VALUE, stringMapper(path(q -> q.rowValue)));
addItemMapping(F_LAST_CHANGE_TIMESTAMP,
TimestampItemFilterProcessor.mapper(path(q -> q.lastChangeTimestamp)));
}

@Override
Expand Down
Expand Up @@ -27,9 +27,6 @@
@SuppressWarnings("unused")
public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {

/** Alias for {@link Types#OTHER} working in tandem with {@link UuidPath}. */
public static final int UUID_TYPE = Types.OTHER;

private static final long serialVersionUID = -4174420892574422778L;

/** If {@code QObject.class} is not enough because of generics, try {@code QObject.CLASS}. */
Expand All @@ -38,7 +35,7 @@ public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {
public static final String TABLE_NAME = "m_object";

public static final ColumnMetadata OID =
ColumnMetadata.named("oid").ofType(UUID_TYPE).notNull();
ColumnMetadata.named("oid").ofType(UuidPath.UUID_TYPE).notNull();
public static final ColumnMetadata EVENT_TYPE =
ColumnMetadata.named("objectTypeClass").ofType(Types.INTEGER).notNull();
public static final ColumnMetadata NAME_NORM =
Expand All @@ -48,7 +45,7 @@ public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {
public static final ColumnMetadata FULL_OBJECT =
ColumnMetadata.named("fullObject").ofType(Types.BINARY);
public static final ColumnMetadata CREATOR_REF_TARGET_OID =
ColumnMetadata.named("creatorRef_targetOid").ofType(UUID_TYPE);
ColumnMetadata.named("creatorRef_targetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata CREATOR_REF_TARGET_TYPE =
ColumnMetadata.named("creatorRef_targetType").ofType(Types.INTEGER);
public static final ColumnMetadata CREATOR_REF_RELATION_ID =
Expand All @@ -58,7 +55,7 @@ public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {
public static final ColumnMetadata CREATE_TIMESTAMP =
ColumnMetadata.named("createTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE);
public static final ColumnMetadata MODIFIER_REF_TARGET_OID =
ColumnMetadata.named("modifierRef_targetOid").ofType(UUID_TYPE);
ColumnMetadata.named("modifierRef_targetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata MODIFIER_REF_TARGET_TYPE =
ColumnMetadata.named("modifierRef_targetType").ofType(Types.INTEGER);
public static final ColumnMetadata MODIFIER_REF_RELATION_ID =
Expand All @@ -68,7 +65,7 @@ public class QObject<T extends MObject> extends FlexibleRelationalPathBase<T> {
public static final ColumnMetadata MODIFY_TIMESTAMP =
ColumnMetadata.named("modifyTimestamp").ofType(Types.TIMESTAMP_WITH_TIMEZONE);
public static final ColumnMetadata TENANT_REF_TARGET_OID =
ColumnMetadata.named("tenantRef_targetOid").ofType(UUID_TYPE);
ColumnMetadata.named("tenantRef_targetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata TENANT_REF_TARGET_TYPE =
ColumnMetadata.named("tenantRef_targetType").ofType(Types.INTEGER);
public static final ColumnMetadata TENANT_REF_RELATION_ID =
Expand Down
Expand Up @@ -7,13 +7,15 @@
package com.evolveum.midpoint.repo.sqale.qmodel.object;

import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.uuidMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.F_TENANT_REF;

import java.util.Collection;

import com.querydsl.core.types.Path;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.schema.GetOperationOptions;
Expand Down Expand Up @@ -44,11 +46,18 @@ protected QObjectMapping(
PolyStringItemFilterProcessor.mapper(
path(q -> q.nameOrig), path(q -> q.nameNorm)));

/* TODO nested-mapping
addItemMapping(ObjectType.F_METADATA,
// TODO nested-mapping
PolyStringItemFilterProcessor.mapper(
path(q -> q.nameOrig), path(q -> q.nameNorm)));
*/
addItemMapping(F_TENANT_REF, RefItemFilterProcessor.mapper(
path(q -> q.tenantRefTargetOid),
path(q -> q.tenantRefTargetType),
path(q -> q.tenantRefRelationId)));

// TODO mappings
// TODO is version mapped for queries at all?
}

@Override
Expand Down
Expand Up @@ -25,7 +25,7 @@ public class QReportOutput extends QObject<MReportOutput> {
public static final String TABLE_NAME = "m_report_output";

public static final ColumnMetadata REPORT_REF_TARGET_OID =
ColumnMetadata.named("reportRef_targetOid").ofType(UUID_TYPE);
ColumnMetadata.named("reportRef_targetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata REPORT_REF_TARGET_TYPE =
ColumnMetadata.named("reportRef_targetType").ofType(Types.INTEGER);
public static final ColumnMetadata REPORT_REF_RELATION_ID =
Expand Down
Expand Up @@ -6,6 +6,9 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.report;

import static com.evolveum.midpoint.xml.ns._public.common.common_3.ReportDataType.F_REPORT_REF;

import com.evolveum.midpoint.repo.sqale.RefItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.object.ObjectSqlTransformer;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
import com.evolveum.midpoint.repo.sqlbase.SqlRepoContext;
Expand All @@ -26,7 +29,10 @@ private QReportOutputMapping() {
super(QReportOutput.TABLE_NAME, DEFAULT_ALIAS_NAME,
ReportDataType.class, QReportOutput.class);

// TODO mapping
addItemMapping(F_REPORT_REF, RefItemFilterProcessor.mapper(
path(q -> q.reportRefTargetOid),
path(q -> q.reportRefTargetType),
path(q -> q.reportRefRelationId)));
}

@Override
Expand Down
Expand Up @@ -37,7 +37,7 @@ public class QAbstractRole<T extends MAbstractRole> extends QObject<T> {
public static final ColumnMetadata IDENTIFIER =
ColumnMetadata.named("identifier").ofType(Types.VARCHAR).withSize(255);
public static final ColumnMetadata OWNER_REF_TARGET_OID =
ColumnMetadata.named("ownerRef_targetOid").ofType(UUID_TYPE);
ColumnMetadata.named("ownerRef_targetOid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata OWNER_REF_TARGET_TYPE =
ColumnMetadata.named("ownerRef_targetType").ofType(Types.INTEGER);
public static final ColumnMetadata OWNER_REF_RELATION_ID =
Expand Down
Expand Up @@ -6,12 +6,17 @@
*/
package com.evolveum.midpoint.repo.sqale.qmodel.role;

import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.booleanMapper;
import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType.*;

import java.util.Collection;

import com.querydsl.core.types.Path;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
Expand All @@ -37,9 +42,14 @@ protected QAbstractRoleMapping(
@NotNull Class<Q> queryType) {
super(tableName, defaultAliasName, schemaType, queryType);

// TODO mappings
// clone RefItemFilterProcessor and rework for UUID/ID for oid/relation
// old version can go to repo-sql-impl for audit only - or perhaps for newer audit too?
// TODO how is approvalProcess mapped? Nothing found in RAbstractRole
// addItemMapping(AbstractRoleType.F_AUTOASSIGN ...TODO nested mapping AutoassignSpecificationType
addItemMapping(F_DISPLAY_NAME, PolyStringItemFilterProcessor.mapper(
path(q -> q.displayNameOrig), path(q -> q.displayNameNorm)));
addItemMapping(F_IDENTIFIER, stringMapper(path(q -> q.identifier)));
// TODO how is ownerRef* mapped? Nothing found in RAbstractRole or as F_ constant
addItemMapping(F_REQUESTABLE, booleanMapper(path(q -> q.requestable)));
addItemMapping(F_RISK_LEVEL, stringMapper(path(q -> q.riskLevel)));
}

@Override
Expand Down

0 comments on commit 855621d

Please sign in to comment.