Skip to content

Commit

Permalink
fix: issue with multiple aliases against same table
Browse files Browse the repository at this point in the history
  • Loading branch information
ryaneorth committed Dec 8, 2022
1 parent e2ac8a6 commit a944a69
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public TableExpression(DatabaseTable table) {
protected void assignAlias(DatabaseTable alias, DatabaseTable table) {
if (this.baseExpression.isQueryKeyExpression()){
QueryKeyExpression qkExpression = ((QueryKeyExpression)this.baseExpression);
if (qkExpression.getTableAliases() != null && qkExpression.getTableAliases().keyAtValue(table) != null ) {
if (!qkExpression.hasQueryKey && qkExpression.getTableAliases() != null && qkExpression.getTableAliases().keyAtValue(table) != null ) {
return;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.descriptors.SerializedObjectPolicy;
import org.eclipse.persistence.descriptors.VersionLockingPolicy;
import org.eclipse.persistence.expressions.Expression;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor;
import org.eclipse.persistence.internal.helper.DatabaseField;
Expand Down Expand Up @@ -218,6 +219,19 @@ protected void addCustomQueryKeys(ClassDescriptor descriptor) {
builder.getTable("CMP3_EMP_PROJ").getField("EMPLOYEES_EMP_ID").equal(
builder.getField("CMP3_EMPLOYEE.EMP_ID")))));
descriptor.addQueryKey(employesQueryKey);

// Project leader's manager
ManyToManyQueryKey projectLeaderManager = new ManyToManyQueryKey();
projectLeaderManager.setName("projectLeaderManager");
projectLeaderManager.setReferenceClass(Employee.class);
builder = new ExpressionBuilder();

projectLeaderManager.setJoinCriteria(
(builder.getParameter("CMP3_PROJECT.LEADER_ID").equal(
builder.getTable("CMP3_EMPLOYEE").getField("EMP_ID")).and(
builder.getTable("CMP3_EMPLOYEE").getField("MANAGER_EMP_ID").equal(
builder.getField("CMP3_EMPLOYEE.EMP_ID")))));
descriptor.addQueryKey(projectLeaderManager);
}
}
//**temp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ public static Test suiteSpring() {
suite.addTest(new JoinedAttributeAdvancedJunitTest("testManagedProjects"));
suite.addTest(new JoinedAttributeAdvancedJunitTest("testManagedLargeProjects"));
suite.addTest(new JoinedAttributeAdvancedJunitTest("testProjectsQK"));
suite.addTest(new JoinedAttributeAdvancedJunitTest("testProjectLeaderManagerQK"));
suite.addTest(new JoinedAttributeAdvancedJunitTest("testLargeProjects"));
// suite.addTest(new JoinedAttributeAdvancedJunitTest("testResponsibilitiesQK"));
suite.addTest(new JoinedAttributeAdvancedJunitTest("testOwner"));
Expand Down Expand Up @@ -1051,6 +1052,24 @@ public void testProjectsQK() {
}
}

public void testProjectLeaderManagerQK() {
final String projectLeaderManagerFirstName = "Jim-bob";
ReadAllQuery query = new ReadAllQuery(Project.class);
ExpressionBuilder eb = query.getExpressionBuilder();
query.setSelectionCriteria(eb.anyOf("projectLeaderManager").get("firstName").equal(projectLeaderManagerFirstName));
@SuppressWarnings({"unchecked"})
List<Project> projects = (List<Project>)getDbSession().executeQuery(query);

// choose example that actually selects something
if(projects.isEmpty()) {
fail();
}

for(final Project project : projects) {
assertEquals(projectLeaderManagerFirstName, project.getTeamLeader().getManager().getFirstName());
}
}

public void testLargeProjects() {
// TODO: currently the test verifies that the query doesn't blow up.
// Add control query so that the results could be verified.
Expand Down

0 comments on commit a944a69

Please sign in to comment.