Skip to content

Commit

Permalink
QFocus added as a superclass for QUser
Browse files Browse the repository at this point in the history
- removed superfluous pk mapping (QObject.pk is enough)
- QObject and QFocus are not abstract, we may need to instantiate them
for "generic" queries
  • Loading branch information
virgo47 committed Feb 1, 2021
1 parent a0b4bd6 commit 929c1b1
Show file tree
Hide file tree
Showing 21 changed files with 306 additions and 134 deletions.
131 changes: 51 additions & 80 deletions repo/repo-sqale/sql/pgnew-repo.sql
Expand Up @@ -142,7 +142,6 @@ INSERT INTO m_reftype VALUES (9, 'DELEGATED');
INSERT INTO m_reftype VALUES (10, 'PERSONA');
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).
Expand Down Expand Up @@ -229,11 +228,11 @@ CREATE TABLE m_focus (
-- will be overridden with GENERATED value in concrete table
objectTypeClass INTEGER NOT NULL DEFAULT 17,
administrativeStatus INTEGER,
archiveTimestamp TIMESTAMPTZ,
disableReason VARCHAR(255),
disableTimestamp TIMESTAMPTZ,
effectiveStatus INTEGER,
enableTimestamp TIMESTAMPTZ,
disableTimestamp TIMESTAMPTZ,
disableReason VARCHAR(255),
archiveTimestamp TIMESTAMPTZ,
validFrom TIMESTAMPTZ,
validTo TIMESTAMPTZ,
validityChangeTimestamp TIMESTAMPTZ,
Expand Down Expand Up @@ -287,6 +286,10 @@ CREATE TRIGGER m_user_oid_delete_tr AFTER DELETE ON m_user
CREATE INDEX m_user_name_orig_idx ON m_user (name_orig);
ALTER TABLE m_user ADD CONSTRAINT m_user_name_norm_key UNIQUE (name_norm);
CREATE INDEX m_user_ext_idx ON m_user USING gin (ext);
CREATE INDEX m_user_fullName_orig_idx ON m_user (fullName_orig);
CREATE INDEX m_user_familyName_orig_idx ON m_user (familyName_orig);
CREATE INDEX m_user_givenName_orig_idx ON m_user (givenName_orig);
CREATE INDEX m_user_employeeNumber_idx ON m_user (employeeNumber);

CREATE TABLE m_shadow (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
Expand Down Expand Up @@ -626,6 +629,50 @@ CREATE TRIGGER m_role_oid_delete_tr AFTER DELETE ON m_role
CREATE INDEX m_role_name_orig_idx ON m_role (name_orig);
ALTER TABLE m_role ADD CONSTRAINT m_role_name_norm_key UNIQUE (name_norm);

CREATE TABLE m_report (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectTypeClass INTEGER GENERATED ALWAYS AS (11) STORED,
export INTEGER,
orientation INTEGER,
parent BOOLEAN,
useHibernateSession BOOLEAN
)
INHERITS (m_object);

CREATE TRIGGER m_value_policy_oid_insert_tr BEFORE INSERT ON m_value_policy
FOR EACH ROW EXECUTE PROCEDURE insert_object_oid();
CREATE TRIGGER m_value_policy_update_tr BEFORE UPDATE ON m_value_policy
FOR EACH ROW EXECUTE PROCEDURE before_update_object();
CREATE TRIGGER m_value_policy_oid_delete_tr AFTER DELETE ON m_value_policy
FOR EACH ROW EXECUTE PROCEDURE delete_object_oid();

CREATE INDEX m_value_policy_name_orig_idx ON m_value_policy (name_orig);
ALTER TABLE m_value_policy ADD CONSTRAINT m_value_policy_name_norm_key UNIQUE (name_norm);

-- TODO old repo had index on parent, does it make sense? if so, which value is sparse?

CREATE TABLE m_report_output (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectTypeClass INTEGER GENERATED ALWAYS AS (12) STORED,
reportRef_targetOid UUID,
reportRef_targetType INTEGER, -- soft-references m_objtype
reportRef_relation_id INTEGER -- soft-references m_qname
)
INHERITS (m_object);

CREATE INDEX iReportNameOrig
ON m_report (name_orig);
ALTER TABLE IF EXISTS m_report
ADD CONSTRAINT uc_report_name UNIQUE (name_norm);
CREATE INDEX iReportOutputNameOrig
ON m_report_output (name_orig);
CREATE INDEX iReportOutputNameNorm
ON m_report_output (name_norm);
ALTER TABLE IF EXISTS m_report
ADD CONSTRAINT fk_report FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_report_output
ADD CONSTRAINT fk_report_output FOREIGN KEY (oid) REFERENCES m_object;

CREATE TABLE m_task (
oid UUID NOT NULL PRIMARY KEY REFERENCES m_object_oid(oid),
objectTypeClass INTEGER GENERATED ALWAYS AS (9) STORED,
Expand Down Expand Up @@ -1183,25 +1230,6 @@ CREATE TABLE m_org (
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
CREATE TABLE m_report (
export INTEGER,
name_norm VARCHAR(255),
name_orig VARCHAR(255),
orientation INTEGER,
parent BOOLEAN,
useHibernateSession BOOLEAN,
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
CREATE TABLE m_report_output (
name_norm VARCHAR(255),
name_orig VARCHAR(255),
reportRef_relation VARCHAR(157),
reportRef_targetOid VARCHAR(36),
reportRef_targetType INTEGER,
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
CREATE TABLE m_resource (
administrativeState INTEGER,
connectorRef_relation VARCHAR(157),
Expand Down Expand Up @@ -1233,29 +1261,6 @@ CREATE TABLE m_trigger (
timestampValue TIMESTAMP,
PRIMARY KEY (owner_oid, id)
);
CREATE TABLE m_user (
additionalName_norm VARCHAR(255),
additionalName_orig VARCHAR(255),
employeeNumber VARCHAR(255),
familyName_norm VARCHAR(255),
familyName_orig VARCHAR(255),
fullName_norm VARCHAR(255),
fullName_orig VARCHAR(255),
givenName_norm VARCHAR(255),
givenName_orig VARCHAR(255),
honorificPrefix_norm VARCHAR(255),
honorificPrefix_orig VARCHAR(255),
honorificSuffix_norm VARCHAR(255),
honorificSuffix_orig VARCHAR(255),
name_norm VARCHAR(255),
name_orig VARCHAR(255),
nickName_norm VARCHAR(255),
nickName_orig VARCHAR(255),
title_norm VARCHAR(255),
title_orig VARCHAR(255),
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
CREATE INDEX iCertCampaignNameOrig
ON m_acc_cert_campaign (name_orig);
ALTER TABLE IF EXISTS m_acc_cert_campaign
Expand Down Expand Up @@ -1453,24 +1458,10 @@ CREATE INDEX iOrgNameOrig
ON m_org (name_orig);
ALTER TABLE IF EXISTS m_org
ADD CONSTRAINT uc_org_name UNIQUE (name_norm);
CREATE INDEX iReportParent
ON m_report (parent);
CREATE INDEX iReportNameOrig
ON m_report (name_orig);
ALTER TABLE IF EXISTS m_report
ADD CONSTRAINT uc_report_name UNIQUE (name_norm);
CREATE INDEX iReportOutputNameOrig
ON m_report_output (name_orig);
CREATE INDEX iReportOutputNameNorm
ON m_report_output (name_norm);
CREATE INDEX iResourceNameOrig
ON m_resource (name_orig);
ALTER TABLE IF EXISTS m_resource
ADD CONSTRAINT uc_resource_name UNIQUE (name_norm);
CREATE INDEX iRoleNameOrig
ON m_role (name_orig);
ALTER TABLE IF EXISTS m_role
ADD CONSTRAINT uc_role_name UNIQUE (name_norm);
CREATE INDEX iSequenceNameOrig
ON m_sequence (name_orig);
ALTER TABLE IF EXISTS m_sequence
Expand All @@ -1487,18 +1478,6 @@ ALTER TABLE IF EXISTS m_system_configuration
ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm);
CREATE INDEX iTriggerTimestamp
ON m_trigger (timestampValue);
CREATE INDEX iFullName
ON m_user (fullName_orig);
CREATE INDEX iFamilyName
ON m_user (familyName_orig);
CREATE INDEX iGivenName
ON m_user (givenName_orig);
CREATE INDEX iEmployeeNumber
ON m_user (employeeNumber);
CREATE INDEX iUserNameOrig
ON m_user (name_orig);
ALTER TABLE IF EXISTS m_user
ADD CONSTRAINT uc_user_name UNIQUE (name_norm);
ALTER TABLE IF EXISTS m_acc_cert_campaign
ADD CONSTRAINT fk_acc_cert_campaign FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_acc_cert_case
Expand Down Expand Up @@ -1641,14 +1620,8 @@ ALTER TABLE IF EXISTS m_object_template
ADD CONSTRAINT fk_object_template FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_org
ADD CONSTRAINT fk_org FOREIGN KEY (oid) REFERENCES m_abstract_role;
ALTER TABLE IF EXISTS m_report
ADD CONSTRAINT fk_report FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_report_output
ADD CONSTRAINT fk_report_output FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_resource
ADD CONSTRAINT fk_resource FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_role
ADD CONSTRAINT fk_role FOREIGN KEY (oid) REFERENCES m_abstract_role;
ALTER TABLE IF EXISTS m_sequence
ADD CONSTRAINT fk_sequence FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_service
Expand All @@ -1657,8 +1630,6 @@ ALTER TABLE IF EXISTS m_system_configuration
ADD CONSTRAINT fk_system_configuration FOREIGN KEY (oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_trigger
ADD CONSTRAINT fk_trigger_owner FOREIGN KEY (owner_oid) REFERENCES m_object;
ALTER TABLE IF EXISTS m_user
ADD CONSTRAINT fk_user FOREIGN KEY (oid) REFERENCES m_focus;
-- Indices for foreign keys; maintained manually
CREATE INDEX iUserEmployeeTypeOid ON M_USER_EMPLOYEE_TYPE(USER_OID);
Expand Down
Expand Up @@ -84,7 +84,9 @@ public SqlRepoContext sqlRepoContext(
// ordered alphabetically here
.register(ArchetypeType.COMPLEX_TYPE, QArchetypeMapping.INSTANCE)
.register(DashboardType.COMPLEX_TYPE, QDashboardMapping.INSTANCE)
.register(FocusType.COMPLEX_TYPE, QFocusMapping.INSTANCE)
.register(NodeType.COMPLEX_TYPE, QNodeMapping.INSTANCE)
.register(ObjectType.COMPLEX_TYPE, QObjectMapping.INSTANCE)
.register(ObjectCollectionType.COMPLEX_TYPE, QObjectCollectionMapping.INSTANCE)
.register(RoleType.COMPLEX_TYPE, QRoleMapping.INSTANCE)
.register(SecurityPolicyType.COMPLEX_TYPE, QSecurityPolicyMapping.INSTANCE)
Expand Down
@@ -0,0 +1,39 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sqale.qbean;

import java.time.Instant;

import com.evolveum.midpoint.repo.sqale.qmodel.QFocus;

/**
* Querydsl "row bean" type related to {@link QFocus}.
*/
public class MFocus extends MObject {

public Integer administrativeStatus;
public Integer effectiveStatus;
public Instant enableTimestamp;
public Instant disableTimestamp;
public String disableReason;
public Instant archiveTimestamp;
public Instant validFrom;
public Instant validTo;
public Instant validityChangeTimestamp;
public Integer validityStatus;
public String costCenter;
public String emailAddress;
public byte[] photo;
public String locale;
public String localityNorm;
public String localityOrig;
public String preferredLanguage;
public String telephoneNumber;
public String timezone;
public Instant passwordCreateTimestamp;
public Instant passwordModifyTimestamp;
}
Expand Up @@ -11,7 +11,7 @@
/**
* Querydsl "row bean" type related to {@link QUser}.
*/
public class MUser extends MObject {
public class MUser extends MFocus {

public String additionalNameNorm;
public String additionalNameOrig;
Expand Down
@@ -0,0 +1,62 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.repo.sqale.qmapping;

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.qbean.MFocus;
import com.evolveum.midpoint.repo.sqale.qmodel.QFocus;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.StringItemFilterProcessor;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;

/**
* Mapping between {@link QFocus} and {@link FocusType}.
*/
public class QFocusMapping<S extends FocusType, Q extends QFocus<R>, R extends MFocus>
extends QObjectMapping<S, Q, R> {

public static final String DEFAULT_ALIAS_NAME = "f";

public static final QFocusMapping<FocusType, QFocus.QFocusReal, MFocus> INSTANCE =
new QFocusMapping<>(QFocus.TABLE_NAME, DEFAULT_ALIAS_NAME,
FocusType.class, QFocus.QFocusReal.class);

protected QFocusMapping(
@NotNull String tableName,
@NotNull String defaultAliasName,
@NotNull Class<S> schemaType,
@NotNull Class<Q> queryType) {
super(tableName, defaultAliasName, schemaType, queryType);

addItemMapping(PrismConstants.T_ID, StringItemFilterProcessor.mapper(path(q -> q.oid)));
addItemMapping(FocusType.F_NAME,
PolyStringItemFilterProcessor.mapper(
path(q -> q.nameOrig), path(q -> q.nameNorm)));

// TODO mappings
}

@Override
public @NotNull Path<?>[] selectExpressions(
Q entity, Collection<SelectorOptions<GetOperationOptions>> options) {
return new Path[] { entity.oid, entity.fullObject };
}

// TODO verify that this allows creation of QFocus alias and that it suffices for "generic query"
@Override
protected Q newAliasInstance(String alias) {
//noinspection unchecked
return (Q) new QFocus<>(MFocus.class, alias);
}
}
Expand Up @@ -23,9 +23,15 @@
/**
* Mapping between {@link QObject} and {@link ObjectType}.
*/
public abstract class QObjectMapping<S extends ObjectType, Q extends QObject<R>, R extends MObject>
public class QObjectMapping<S extends ObjectType, Q extends QObject<R>, R extends MObject>
extends SqaleModelMapping<S, Q, R> {

public static final String DEFAULT_ALIAS_NAME = "o";

public static final QObjectMapping<ObjectType, QObject.QObjectReal, MObject> INSTANCE =
new QObjectMapping<>(QObject.TABLE_NAME, DEFAULT_ALIAS_NAME,
ObjectType.class, QObject.QObjectReal.class);

protected QObjectMapping(
@NotNull String tableName,
@NotNull String defaultAliasName,
Expand All @@ -50,4 +56,11 @@ protected QObjectMapping(
Q entity, Collection<SelectorOptions<GetOperationOptions>> options) {
return new Path[] { entity.oid, entity.fullObject };
}

// TODO verify that this allows creation of QObject alias and that it suffices for "generic query"
@Override
protected Q newAliasInstance(String alias) {
//noinspection unchecked
return (Q) new QObject<>(MObject.class, alias);
}
}
Expand Up @@ -41,7 +41,7 @@ protected QRole newAliasInstance(String alias) {
@Override
public ObjectSqlTransformer<RoleType, QRole, MRole>
createTransformer(SqlTransformerContext transformerContext, SqlRepoContext sqlRepoContext) {
// no special class needed, no additional columns
// TODO create specific transformer
return new ObjectSqlTransformer<>(transformerContext, this);
}

Expand Down
Expand Up @@ -37,7 +37,7 @@ protected QTask newAliasInstance(String alias) {
@Override
public ObjectSqlTransformer<TaskType, QTask, MTask>
createTransformer(SqlTransformerContext transformerContext, SqlRepoContext sqlRepoContext) {
// no special class needed, no additional columns
// TODO create specific transformer
return new ObjectSqlTransformer<>(transformerContext, this);
}

Expand Down
Expand Up @@ -20,7 +20,7 @@
* Mapping between {@link QUser} and {@link UserType}.
*/
public class QUserMapping
extends QObjectMapping<UserType, QUser, MUser> {
extends QFocusMapping<UserType, QUser, MUser> {

public static final String DEFAULT_ALIAS_NAME = "u";

Expand Down Expand Up @@ -66,7 +66,7 @@ protected QUser newAliasInstance(String alias) {
@Override
public ObjectSqlTransformer<UserType, QUser, MUser>
createTransformer(SqlTransformerContext transformerContext, SqlRepoContext sqlRepoContext) {
// no special class needed, no additional columns
// TODO create specific transformer
return new ObjectSqlTransformer<>(transformerContext, this);
}

Expand Down

0 comments on commit 929c1b1

Please sign in to comment.