Skip to content

Commit

Permalink
reorganized the search query code/added some final optimization fine-…
Browse files Browse the repository at this point in the history
…tuning (#5615)
  • Loading branch information
landreev committed Nov 8, 2019
1 parent 561d299 commit e6c989e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 23 deletions.
3 changes: 1 addition & 2 deletions src/main/java/edu/harvard/iq/dataverse/Dataverse.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@
@NamedQuery(name = "Dataverse.findByOwnerId", query="select object(o) from Dataverse as o where o.owner.id =:ownerId order by o.name"),
@NamedQuery(name = "Dataverse.filterByAlias", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.alias) LIKE :alias order by dv.alias"),
@NamedQuery(name = "Dataverse.filterByAliasNameAffiliation", query="SELECT dv FROM Dataverse dv WHERE (LOWER(dv.alias) LIKE :alias) OR (LOWER(dv.name) LIKE :name) OR (LOWER(dv.affiliation) LIKE :affiliation) order by dv.alias"),
@NamedQuery(name = "Dataverse.filterByName", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.name) LIKE :name order by dv.alias"),
@NamedQuery(name = "Dataverse.filterByNamePattern", query="SELECT dv FROM Dataverse dv WHERE (LOWER(dv.name) LIKE :pattern1) OR (LOWER(dv.name) LIKE :pattern2) order by dv.alias")
@NamedQuery(name = "Dataverse.filterByName", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.name) LIKE :name order by dv.alias")
})
@Entity
@Table(indexes = {@Index(columnList="defaultcontributorrole_id")
Expand Down
73 changes: 52 additions & 21 deletions src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -474,9 +474,7 @@ public List<Dataverse> filterDataversesForLinking(String query, DataverseRequest

List<Dataverse> dataverseList = new ArrayList<>();

List<Dataverse> results = em.createNamedQuery("Dataverse.filterByName", Dataverse.class)
.setParameter("name", "%" + query.toLowerCase() + "%")
.getResultList();
List<Dataverse> results = filterDataversesByNamePattern(query);

List<Object> alreadyLinkeddv_ids = em.createNativeQuery("SELECT linkingdataverse_id FROM datasetlinkingdataverse WHERE dataset_id = " + dataset.getId()).getResultList();
List<Dataverse> remove = new ArrayList<>();
Expand All @@ -500,26 +498,10 @@ public List<Dataverse> filterDataversesForLinking(String query, DataverseRequest

public List<Dataverse> filterDataversesForHosting(String pattern, DataverseRequest req) {

pattern = pattern.toLowerCase();
// Find the dataverses matching the search parameters:

String pattern1 = pattern + "%";
String pattern2 = "% " + pattern + "%";

// Adjust the queries for very short, 1 and 2-character patterns:
if (pattern.length() < 3) {
pattern1 = pattern;
pattern2 = pattern + " %";
}
if (pattern.length() == 2) {
pattern2 = pattern + "%";
}
List<Dataverse> searchResults = filterDataversesByNamePattern(pattern);

// Find the dataverses matching the search parameters:
List<Dataverse> searchResults = em.createNamedQuery("Dataverse.filterByNamePattern", Dataverse.class)
.setParameter("pattern1", pattern1)
.setParameter("pattern2", pattern2)
.getResultList();

logger.fine("search query found " + searchResults.size() + " results");

// Filter the results and drop the dataverses where the user is not allowed to
Expand All @@ -543,6 +525,55 @@ public List<Dataverse> filterDataversesForHosting(String pattern, DataverseReque
return finalResults;
}


/*
This method takes a search parameter and expands it into a list of
Dataverses with matching names.
The search is performed on the name with the trailing word "dataverse"
stripped (if present). This way the search on "data" (or on "da" pr
"dat") does NOT return almost every dataverse in the database - since
most of them have names that end in "... Dataverse".
The query isn't pretty, but it works, and it's still EJB QL (and NOT a
native query).
*/
public List<Dataverse> filterDataversesByNamePattern(String pattern) {

pattern = pattern.toLowerCase();

String pattern1 = pattern + "%";
String pattern2 = "% " + pattern + "%";

// Adjust the queries for very short, 1 and 2-character patterns:
if (pattern.length() == 1) {
pattern1 = pattern;
pattern2 = pattern + " %";
}
/*if (pattern.length() == 2) {
pattern2 = pattern + "%";
}*/


String qstr = "select dv from Dataverse dv "
+ "where (LOWER(dv.name) LIKE '%dataverse' and ((SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE '" + pattern1 + "') "
+ " or (SUBSTRING(LOWER(dv.name),0,(LENGTH(dv.name)-9)) LIKE '" + pattern2 + "'))) "
+ "or (LOWER(dv.name) NOT LIKE '%dataverse' and ((LOWER(dv.name) LIKE '" + pattern1 + "') "
+ " or (LOWER(dv.name) LIKE '" + pattern2 + "'))) "
+ "order by dv.alias";

List<Dataverse> testResults = null;

try {
testResults = em.createQuery(qstr, Dataverse.class)
//.setParameter("pattern1", "pattern1")
//.setParameter("pattern2", "pattern2")
.getResultList();
} catch (Exception ex) {
testResults = null;
}

return testResults;
}

/**
* Used to identify and properly display Harvested objects on the dataverse page.
*
Expand Down

0 comments on commit e6c989e

Please sign in to comment.