Skip to content

Commit

Permalink
MID-7425: fix of query playground, custom types were not supported
Browse files Browse the repository at this point in the history
Originally I put only Querydsl template into SimulatedSqlQuery, but
this does not help with custom types. Querydsl Configuration was needed.
Test for "translate only" was added too.
  • Loading branch information
virgo47 committed Nov 18, 2021
1 parent de2d5bc commit 703fd67
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import java.util.LinkedHashMap;
import java.util.Map;

import com.querydsl.sql.Configuration;
import com.querydsl.sql.SQLQuery;
import com.querydsl.sql.SQLTemplates;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -33,10 +33,10 @@ public class SimulatedSqlQuery<T> extends SQLQuery<T> {
private Map<String, RepositoryQueryDiagResponse.ParameterValue> params;

public SimulatedSqlQuery(
@NotNull SQLTemplates querydslTemplates,
@NotNull Configuration querydslConfiguration,
@Nullable Connection conn,
boolean simulationOnly) {
super(conn, querydslTemplates);
super(conn, querydslConfiguration);
this.simulationOnly = simulationOnly;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1732,7 +1732,7 @@ public RepositoryQueryDiagResponse executeQueryDiagnostics(
try (JdbcSession jdbcSession = sqlRepoContext.newJdbcSession().startReadOnlyTransaction()) {
// Modified code from SqlQueryExecutor.list()
SimulatedSqlQuery<Object> simulatedQuery = new SimulatedSqlQuery<>(
sqlRepoContext.getQuerydslTemplates(), jdbcSession.connection(), request.isTranslateOnly());
sqlRepoContext.getQuerydslConfiguration(), jdbcSession.connection(), request.isTranslateOnly());
SqaleQueryContext<S, Q, R> context =
SqaleQueryContext.from(type, sqlRepoContext, simulatedQuery, null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import org.testng.Assert;
import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;

import com.evolveum.midpoint.prism.PrismObject;
Expand Down Expand Up @@ -52,6 +53,11 @@
*/
public class SqaleRepoSmokeTest extends SqaleRepoBaseTest {

@AfterMethod
public void methodCleanup() {
queryRecorder.stopRecording();
}

@Test
public void test000Sanity() {
assertThat(repositoryService).isNotNull();
Expand Down Expand Up @@ -434,19 +440,27 @@ public void test400SqlLogger() throws Exception {

@Test
public void test500ExecuteQueryDiagnostics() throws Exception {
// also known as "Query Playground"
OperationResult result = createOperationResult();

given("some objects are in the repository");
String name = "user" + getTestNumber();
repositoryService.addObject(
new UserType(prismContext).name(name).asPrismObject(),
new UserType(prismContext).name(name)
.activation(new ActivationType(prismContext).administrativeStatus(ActivationStatusType.ENABLED))
.asPrismObject(),
null, result);
queryRecorder.clearBufferAndStartRecording();

when("executeQueryDiagnostics is called with query");
RepositoryQueryDiagRequest request = new RepositoryQueryDiagRequest();
request.setType(UserType.class);
request.setQuery(prismContext.queryFor(UserType.class)
.item(UserType.F_NAME).eqPoly(name)
.and()
// custom types, reproduces MID-7425
.item(UserType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS)
.eq(ActivationStatusType.ENABLED)
.build());
RepositoryQueryDiagResponse response = repositoryService.executeQueryDiagnostics(request, result);

Expand All @@ -455,12 +469,40 @@ public void test500ExecuteQueryDiagnostics() throws Exception {
assertThat(response.getQueryResult()).hasSize(1)
.extracting(o -> ((PrismObject<?>) o).asObjectable().getName().getOrig())
.containsExactly(name);
assertThat(response.getImplementationLevelQuery()).asString()
.isEqualToIgnoringWhitespace("select u.oid, u.fullObject from m_user u"
+ " where u.nameNorm = ? and u.nameOrig = ? and u.administrativeStatus = ?"
+ " limit ?");

assertThat(queryRecorder.getQueryBuffer()).hasSize(1);
}

@Test
public void test501ExecuteQueryDiagnosticsTranslateOnly() {
// also known as "Query Playground"
OperationResult result = createOperationResult();

given("diag request with translate only = true");
queryRecorder.clearBufferAndStartRecording();
RepositoryQueryDiagRequest request = new RepositoryQueryDiagRequest();
request.setType(UserType.class);
request.setTranslateOnly(true);
request.setQuery(prismContext.queryFor(UserType.class)
.item(UserType.F_NAME).eqPoly("whatever")
.build());

when("executeQueryDiagnostics is called with query");
RepositoryQueryDiagResponse response = repositoryService.executeQueryDiagnostics(request, result);

then("query is translated but not executed");
assertThat(response).isNotNull();
assertThat(response.getQueryResult()).isNullOrEmpty();
assertThat(response.getImplementationLevelQuery()).asString()
.isEqualToIgnoringWhitespace("select u.oid, u.fullObject from m_user u"
+ " where u.nameNorm = ? and u.nameOrig = ?"
+ " limit ?");

// test for "translateOnly = true" is omitted, but it works, see
assertThat(queryRecorder.getQueryBuffer()).isEmpty();
}

// region low-level tests
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ public SQLTemplates getQuerydslTemplates() {
return querydslConfig.getTemplates();
}

public Configuration getQuerydslConfiguration() {
return querydslConfig;
}

public SQLInsertClause newInsert(Connection connection, RelationalPath<?> entity) {
return new SQLInsertClause(connection, querydslConfig, entity);
}
Expand Down

0 comments on commit 703fd67

Please sign in to comment.