Skip to content

Commit

Permalink
Rewriting JPAAnySearchDAO to reduce subqueries
Browse files Browse the repository at this point in the history
  • Loading branch information
ilgrosso committed Jan 17, 2025
1 parent 9fb0938 commit 0311ed7
Show file tree
Hide file tree
Showing 5 changed files with 1,288 additions and 15 deletions.
16 changes: 8 additions & 8 deletions core/persistence-jpa/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -118,23 +118,23 @@ under the License.
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@
import org.apache.syncope.core.persistence.jpa.content.KeymasterConfParamLoader;
import org.apache.syncope.core.persistence.jpa.content.XMLContentExporter;
import org.apache.syncope.core.persistence.jpa.content.XMLContentLoader;
import org.apache.syncope.core.persistence.jpa.dao.AnySearchNodeDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAAccessTokenDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAAnyMatchDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAAnySearchDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAAnyTypeClassDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAAnyTypeDAO;
import org.apache.syncope.core.persistence.jpa.dao.JPAApplicationDAO;
Expand Down Expand Up @@ -384,7 +384,7 @@ public AnySearchDAO anySearchDAO(
final AnyUtilsFactory anyUtilsFactory,
final PlainAttrValidationManager validator) {

return new JPAAnySearchDAO(
return new AnySearchNodeDAO(
realmDAO,
dynRealmDAO,
userDAO,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.core.persistence.jpa.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public class AnySearchNode {

enum Type {
AND,
OR,
LEAF

}

public static class Leaf extends AnySearchNode {

private final SearchSupport.SearchView from;

private final String clause;

protected Leaf(final SearchSupport.SearchView from, final String clause) {
super(Type.LEAF);
this.from = from;
this.clause = clause;
}

public SearchSupport.SearchView getFrom() {
return from;
}

public String getClause() {
return clause;
}

@Override
public int hashCode() {
return new HashCodeBuilder().
appendSuper(super.hashCode()).
append(from).
append(clause).
build();
}

@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Leaf other = (Leaf) obj;

return new EqualsBuilder().
appendSuper(super.equals(obj)).
append(from, other.from).
append(clause, other.clause).
build();
}

@Override
public String toString() {
return "LeafNode{" + "from=" + from + ", clause=" + clause + '}';

Check notice

Code scanning / CodeQL

Use of default toString() Note

Default toString(): SearchView inherits toString() from Object, and so is not suitable for printing.
}
}

private final Type type;

private final List<AnySearchNode> children = new ArrayList<>();

protected AnySearchNode(final Type type) {
this.type = type;
}

protected Type getType() {
return type;
}

protected boolean add(final AnySearchNode child) {
if (type == Type.LEAF) {
throw new IllegalArgumentException("Cannot add children to a leaf node");
}
return children.add(child);
}

protected List<AnySearchNode> getChildren() {
return children;
}

protected Optional<Leaf> asLeaf() {
return type == Type.LEAF
? Optional.of((Leaf) this)
: Optional.empty();
}

@Override
public int hashCode() {
return new HashCodeBuilder().
append(type).
append(children).
build();
}

@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final AnySearchNode other = (AnySearchNode) obj;

return new EqualsBuilder().
append(type, other.type).
append(children, other.children).
build();
}

@Override
public String toString() {
return "Node{" + "type=" + type + ", children=" + children + '}';
}
}
Loading

0 comments on commit 0311ed7

Please sign in to comment.