Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into feature/thread-safe…
Browse files Browse the repository at this point in the history
…ty-immutables
  • Loading branch information
tonydamage committed Feb 17, 2021
2 parents 7c75c25 + 7992c2d commit 0fb4f65
Show file tree
Hide file tree
Showing 18 changed files with 199 additions and 65 deletions.
Expand Up @@ -79,7 +79,8 @@ public boolean check() throws CommonException {
if (errorOk) {
return executionStatusIsDone();
} else {
throw new AssertionError("Error in " + freshTask + ": " + TestUtil.getErrorMessage(result));
display("Failed result of task " + freshTask, freshTask.getResult());
throw new AssertionError("Error in " + freshTask + ": " + result);
}
} else {
boolean resultDone = !isUnknown(result, checkSubresult) && !isInProgress(result, checkSubresult);
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -911,7 +911,7 @@
<dependency>
<groupId>com.evolveum.polygon</groupId>
<artifactId>connector-ldap</artifactId>
<version>3.2-M1</version>
<version>3.2-M2</version>
<exclusions>
<!-- Needed otherwise the JDK14 SLF4J binding can override the midpoint's logback binding -->
<exclusion>
Expand Down
Expand Up @@ -14,7 +14,7 @@
<name>ICF com.evolveum.polygon.connector.ldap.LdapConnector</name>
<framework>http://midpoint.evolveum.com/xml/ns/public/connector/icf-1</framework>
<connectorType>com.evolveum.polygon.connector.ldap.LdapConnector</connectorType>
<connectorVersion>3.2-M1</connectorVersion>
<connectorVersion>3.2-M2</connectorVersion>
<connectorBundle>com.evolveum.polygon.connector-ldap</connectorBundle>
<namespace>http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.polygon.connector-ldap/com.evolveum.polygon.connector.ldap.LdapConnector</namespace>
<schema>
Expand Down
28 changes: 15 additions & 13 deletions repo/repo-sqale/sql/pgnew-repo.sql
Expand Up @@ -31,7 +31,7 @@ $$;
CREATE TABLE m_object_oid (
oid UUID NOT NULL DEFAULT gen_random_uuid(),

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

Expand Down Expand Up @@ -917,7 +917,7 @@ CREATE TABLE m_assignment (
modifyChannel_id INTEGER,
modifyTimestamp TIMESTAMPTZ,

CONSTRAINT m_assignment_pk PRIMARY KEY (owner_oid, cid)
PRIMARY KEY (owner_oid, cid)
-- no need to index owner_oid, it's part of the PK index
);

Expand Down Expand Up @@ -957,6 +957,19 @@ ALTER TABLE IF EXISTS m_assignment_reference
*/
-- endregion

-- region other object containers
CREATE TABLE m_trigger (
owner_oid UUID NOT NULL REFERENCES m_object_oid(oid),
id INTEGER NOT NULL,
handlerUri_id INTEGER,
timestampValue TIMESTAMPTZ,

PRIMARY KEY (owner_oid, id)
);

CREATE INDEX m_trigger_timestampValue_idx ON m_trigger (timestampValue);
-- endregion

-- region Extension support
-- TODO: catalog unused at the moment
CREATE TABLE m_ext_item (
Expand Down Expand Up @@ -1368,13 +1381,6 @@ CREATE TABLE m_sequence (
oid VARCHAR(36) NOT NULL,
PRIMARY KEY (oid)
);
CREATE TABLE m_trigger (
id INTEGER NOT NULL,
owner_oid UUID NOT NULL,
handlerUri_id INTEGER,
timestampValue TIMESTAMPTZ,
PRIMARY KEY (owner_oid, id)
);
CREATE INDEX iAExtensionBoolean
ON m_assignment_ext_boolean (booleanValue);
CREATE INDEX iAExtensionDate
Expand Down Expand Up @@ -1536,8 +1542,6 @@ CREATE INDEX iSystemConfigurationNameOrig
ON m_system_configuration (name_orig);
ALTER TABLE IF EXISTS m_system_configuration
ADD CONSTRAINT uc_system_configuration_name UNIQUE (name_norm);
CREATE INDEX iTriggerTimestamp
ON m_trigger (timestampValue);
ALTER TABLE IF EXISTS m_assignment_ext_boolean
ADD CONSTRAINT fk_a_ext_boolean_owner FOREIGN KEY (anyContainer_owner_owner_oid, anyContainer_owner_id) REFERENCES m_assignment_extension;
ALTER TABLE IF EXISTS m_assignment_ext_date
Expand Down Expand Up @@ -1658,8 +1662,6 @@ ALTER TABLE IF EXISTS m_sequence
ADD CONSTRAINT fk_sequence FOREIGN KEY (oid) REFERENCES m_object;
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;
-- Indices for foreign keys; maintained manually
CREATE INDEX iUserEmployeeTypeOid ON M_USER_EMPLOYEE_TYPE(USER_OID);
Expand Down
Expand Up @@ -31,6 +31,7 @@
import com.evolveum.midpoint.repo.sqale.qmodel.node.QNodeMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QAssignmentHolderMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QObjectMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.object.QTriggerMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.report.QReportDataMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.report.QReportMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.role.QAbstractRoleMapping;
Expand Down Expand Up @@ -118,6 +119,7 @@ public SqaleRepoContext sqlRepoContext(
.register(ServiceType.COMPLEX_TYPE, QServiceMapping.INSTANCE)
.register(SystemConfigurationType.COMPLEX_TYPE, QSystemConfigurationMapping.INSTANCE)
.register(TaskType.COMPLEX_TYPE, QTaskMapping.INSTANCE)
.register(TriggerType.COMPLEX_TYPE, QTriggerMapping.INSTANCE)
.register(UserType.COMPLEX_TYPE, QUserMapping.INSTANCE)
.register(ValuePolicyType.COMPLEX_TYPE, QValuePolicyMapping.INSTANCE)
.seal();
Expand Down
Expand Up @@ -31,7 +31,7 @@ public class QAssignment extends FlexibleRelationalPathBase<MAssignment> {

public static final ColumnMetadata OWNER_OID =
ColumnMetadata.named("owner_oid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata ID =
public static final ColumnMetadata CID =
ColumnMetadata.named("cid").ofType(Types.INTEGER);
public static final ColumnMetadata OWNER_TYPE =
ColumnMetadata.named("owner_type").ofType(Types.INTEGER);
Expand Down Expand Up @@ -119,7 +119,7 @@ public class QAssignment extends FlexibleRelationalPathBase<MAssignment> {
// attributes

public final UuidPath ownerOid = createUuid("ownerOid", OWNER_OID);
public final NumberPath<Integer> cid = createInteger("cid", ID);
public final NumberPath<Integer> cid = createInteger("cid", CID);
public final NumberPath<Integer> ownerType = createInteger("ownerType", OWNER_TYPE);
public final NumberPath<Integer> assignmentOwner =
createInteger("assignmentOwner", ASSIGNMENT_OWNER);
Expand Down
@@ -0,0 +1,21 @@
/*
* 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.qmodel.object;

import java.time.Instant;
import java.util.UUID;

/**
* Querydsl "row bean" type related to {@link QTrigger}.
*/
public class MTrigger {

public UUID ownerOid;
public Integer cid;
public Integer handlerUriId;
public Instant timestampValue;
}
Expand Up @@ -8,6 +8,7 @@

import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.stringMapper;
import static com.evolveum.midpoint.repo.sqlbase.mapping.item.SimpleItemFilterProcessor.uuidMapper;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType.F_ARCHETYPE_REF;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.*;

import java.util.Collection;
Expand All @@ -20,6 +21,7 @@
import com.evolveum.midpoint.repo.sqale.UriItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqale.qmodel.assignment.QAssignment;
import com.evolveum.midpoint.repo.sqale.qmodel.role.QArchetype;
import com.evolveum.midpoint.repo.sqlbase.SqlTransformerContext;
import com.evolveum.midpoint.repo.sqlbase.mapping.SqlTransformer;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.PolyStringItemFilterProcessor;
Expand Down Expand Up @@ -82,7 +84,10 @@ protected QObjectMapping(
addRelationResolver(AssignmentHolderType.F_ASSIGNMENT,
new TableRelationResolver<>(QAssignment.class,
joinOn((o, a) -> o.oid.eq(a.ownerOid))));
// TODO map trigger
addRelationResolver(F_TRIGGER,
new TableRelationResolver<>(QTrigger.class,
joinOn((o, t) -> o.oid.eq(t.ownerOid))));
// TODO needed? addRelationResolver(F_ARCHETYPE_REF... ref
}

@Override
Expand Down
@@ -0,0 +1,56 @@
/*
* 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.qmodel.object;

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.sql.ColumnMetadata;
import com.querydsl.sql.PrimaryKey;

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

/**
* Querydsl query type for {@value #TABLE_NAME} table.
*/
@SuppressWarnings("unused")
public class QTrigger extends FlexibleRelationalPathBase<MTrigger> {

private static final long serialVersionUID = 2478404102829142213L;

public static final String TABLE_NAME = "m_trigger";

public static final ColumnMetadata OWNER_OID =
ColumnMetadata.named("owner_oid").ofType(UuidPath.UUID_TYPE);
public static final ColumnMetadata CID =
ColumnMetadata.named("cid").ofType(Types.INTEGER);
public static final ColumnMetadata HANDLER_URI_ID =
ColumnMetadata.named("handlerUri_id").ofType(Types.INTEGER);
public static final ColumnMetadata TIMESTAMP_VALUE =
ColumnMetadata.named("timestampValue").ofType(Types.TIMESTAMP_WITH_TIMEZONE);

// attributes

public final UuidPath ownerOid = createUuid("ownerOid", OWNER_OID);
public final NumberPath<Integer> cid = createInteger("cid", CID);
public final NumberPath<Integer> handlerUriId = createInteger("handlerUriId", HANDLER_URI_ID);
public final DateTimePath<Instant> timestampValue =
createInstant("timestampValue", TIMESTAMP_VALUE);

public final PrimaryKey<MTrigger> id = createPrimaryKey(ownerOid, cid);

public QTrigger(String variable) {
this(variable, DEFAULT_SCHEMA_NAME, TABLE_NAME);
}

public QTrigger(String variable, String schema, String table) {
super(MTrigger.class, variable, schema, table);
}
}
@@ -0,0 +1,50 @@
/*
* 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.qmodel.object;

import com.evolveum.midpoint.repo.sqale.UriItemFilterProcessor;
import com.evolveum.midpoint.repo.sqale.qmodel.SqaleModelMapping;
import com.evolveum.midpoint.repo.sqlbase.mapping.item.TimestampItemFilterProcessor;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType;

/**
* Mapping between {@link QTrigger} and {@link TriggerType}.
*/
public class QTriggerMapping
extends SqaleModelMapping<TriggerType, QTrigger, MTrigger> {

public static final String DEFAULT_ALIAS_NAME = "trg";

public static final QTriggerMapping INSTANCE = new QTriggerMapping();

private QTriggerMapping() {
super(QTrigger.TABLE_NAME, DEFAULT_ALIAS_NAME,
TriggerType.class, QTrigger.class);

// TODO (how) is CID queried?
addItemMapping(TriggerType.F_HANDLER_URI,
UriItemFilterProcessor.mapper(path(q -> q.handlerUriId)));
addItemMapping(TriggerType.F_TIMESTAMP,
TimestampItemFilterProcessor.mapper(path(q -> q.timestampValue)));
}

@Override
protected QTrigger newAliasInstance(String alias) {
return new QTrigger(alias);
}

// @Override TODO
// public TriggerSqlTransformer createTransformer(
// SqlTransformerContext transformerContext) {
// return new TriggerSqlTransformer(transformerContext, this);
// }

@Override
public MTrigger newRowObject() {
return new MTrigger();
}
}
Expand Up @@ -7,14 +7,14 @@
package com.evolveum.midpoint.repo.sqlbase;

import java.sql.Connection;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.ComparableExpressionBase;
Expand Down Expand Up @@ -170,7 +170,7 @@ public PageOf<Tuple> executeQuery(Connection conn) throws QueryException {
// SQL logging is on DEBUG level of: com.querydsl.sql
Q entity = root();
List<Tuple> data = query
.select(mapping().selectExpressions(entity, options))
.select(buildSelectExpressions(entity, query))
.fetch();

// TODO: run fetchers selectively based on options?
Expand All @@ -187,6 +187,23 @@ public PageOf<Tuple> executeQuery(Connection conn) throws QueryException {
return new PageOf<>(data, PageOf.PAGE_NO_PAGINATION, 0);
}

private @NotNull Expression<?>[] buildSelectExpressions(Q entity, SQLQuery<?> query) {
Path<?>[] defaultExpressions = mapping().selectExpressions(entity, options);
if (!query.getMetadata().isDistinct() || query.getMetadata().getOrderBy().isEmpty()) {
return defaultExpressions;
}

// If DISTINCT is used with ORDER BY then anything in ORDER BY must be in SELECT too
List<Expression<?>> expressions = new ArrayList<>(Arrays.asList(defaultExpressions));
for (OrderSpecifier<?> orderSpecifier : query.getMetadata().getOrderBy()) {
Expression<?> orderPath = orderSpecifier.getTarget();
if (!expressions.contains(orderPath)) {
expressions.add(orderPath);
}
}
return expressions.toArray(new Expression<?>[0]);
}

public int executeCount(Connection conn) {
return (int) sqlQuery.clone(conn)
.select(root())
Expand Down Expand Up @@ -244,8 +261,12 @@ public void processOptions(Collection<SelectorOptions<GetOperationOptions>> opti
return;
}

// TODO MID-6319: what other options are here? can they all be processed after filter?
if (GetOperationOptions.isDistinct(SelectorOptions.findRootOptions(options))) {
// TODO what other options we need here? can they all be processed after filter?

// Dropping DISTINCT without JOIN is OK for object/container queries where select
// already contains distinct columns (OID or owner_oid+cid).
if (GetOperationOptions.isDistinct(SelectorOptions.findRootOptions(options))
&& sqlQuery.getMetadata().getJoins().size() > 1) {
sqlQuery.distinct();
}
}
Expand Down
Expand Up @@ -2268,7 +2268,7 @@ public void test850ReconcileAccounts() throws Exception {
when();
addTask(getReconciliationTaskFile());

waitForTaskFinish(getReconciliationTaskOid(), true);
waitForTaskFinish(getReconciliationTaskOid(), false);

// THEN
then();
Expand Down
Expand Up @@ -60,11 +60,9 @@ public void test0010createUser() {
.updateSearch()
.and()
.clickByName("jdoe222323")
.selectTabBasic()
.form()
.assertPropertyInputValue("name", "jdoe222323")
.assertPropertyInputValue("givenName", "john")
.assertPropertyInputValue("familyName", "doe");
.assertName("jdoe222323")
.assertGivenName("john")
.assertFamilyName("doe");

}

Expand Down Expand Up @@ -94,9 +92,7 @@ public void test0020isLocalizedPolystringValueDisplayed(){
.updateSearch()
.and()
.clickByName(LOCALIZATION_TEST_USER_NAME_ORIG)
.selectTabBasic()
.form()
.assertPropertyInputValue("name", LOCALIZATION_TEST_USER_NAME_DE);
.assertName(LOCALIZATION_TEST_USER_NAME_DE);
}

@Test
Expand Down

0 comments on commit 0fb4f65

Please sign in to comment.