Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
fix(search): Fix sort in Zanata search page
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Jul 15, 2015
1 parent 2bae087 commit b6b166c
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 50 deletions.
Expand Up @@ -27,7 +27,6 @@
import javax.annotation.Nullable;
import javax.faces.application.FacesMessage;
import javax.faces.event.ValueChangeEvent;
import javax.xml.ws.Service;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Session;
Expand Down Expand Up @@ -235,7 +234,7 @@ public List<HProjectIteration> getSortedInstanceProjectIterations() {
List<HProjectIteration> list =
Lists.newArrayList(getInstance().getProjectIterations());

Collections.sort(list, ComparatorUtil.PROJECT_NAME_COMPARATOR);
Collections.sort(list, ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR);

return list;
}
Expand Down
Expand Up @@ -307,8 +307,8 @@ public int compare(HProjectIteration o1, HProjectIteration o2) {
wordStatistic2.getUntranslated());
}
} else {
return o1.getProject().getName().toLowerCase()
.compareTo(o2.getProject().getName().toLowerCase());
return ComparatorUtil.compareStringIgnoreCase(
o1.getProject().getName(), o2.getProject().getName());
}
return 0;
}
Expand Down
85 changes: 56 additions & 29 deletions zanata-war/src/main/java/org/zanata/action/ZanataSearch.java
Expand Up @@ -17,23 +17,26 @@
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.zanata.common.EntityStatus;
import org.zanata.dao.AccountDAO;
import org.zanata.dao.ProjectDAO;
import org.zanata.dao.ProjectIterationDAO;
import org.zanata.model.HAccount;
import org.zanata.model.HProject;

import com.google.common.collect.Lists;
import org.zanata.ui.AbstractAutocomplete;
import org.zanata.ui.AbstractListFilter;
import org.zanata.ui.InMemoryListFilter;
import org.zanata.util.ComparatorUtil;
import org.zanata.util.DateUtil;
import org.zanata.util.ServiceLocator;

/**
* This will search both projects and people.
*/
@Name("zanataSearch")
@Scope(ScopeType.CONVERSATION)
@Scope(ScopeType.PAGE)
@AutoCreate
public class ZanataSearch implements Serializable {

Expand All @@ -44,6 +47,9 @@ public class ZanataSearch implements Serializable {
@In
private ProjectDAO projectDAO;

@In
private ProjectIterationDAO projectIterationDAO;

@In
private AccountDAO accountDAO;

Expand Down Expand Up @@ -71,6 +77,10 @@ public class ZanataSearch implements Serializable {
private final UserComparator userComparator =
new UserComparator(getUserSortingList());

private List<HProject> projects;

private List<HAccount> accounts;

@AllArgsConstructor
@NoArgsConstructor
public class SearchResult {
Expand Down Expand Up @@ -103,7 +113,7 @@ private class ProjectUserAutocomplete extends
@Override
public List<SearchResult> suggest() {
List<SearchResult> result = Lists.newArrayList();
if (StringUtils.isEmpty(getQuery())) {
if (StringUtils.isBlank(getQuery())) {
return result;
}
try {
Expand All @@ -126,7 +136,6 @@ public List<SearchResult> suggest() {
} catch (ParseException pe) {
return result;
}

}

/**
Expand All @@ -146,28 +155,17 @@ public void setQuery(String query) {
@Getter
private final AbstractListFilter<HProject> projectTabProjectFilter =
new InMemoryListFilter<HProject>() {

private ProjectDAO projectDAO = ServiceLocator.instance()
.getInstance(ProjectDAO.class);
/**
* Fetches all records.
*
* @return A list of all records to be managed by the filter.
*/
@Override
protected List<HProject> fetchAll() {
if (StringUtils.isEmpty(getAutocomplete().getQuery())) {
return Collections.emptyList();
}
try {
List<HProject> projects =
projectDAO.searchProjects(getAutocomplete()
.getQuery(), -1, 0, includeObsolete);
Collections.sort(projects, projectComparator);
return projects;
} catch (ParseException e) {
if (StringUtils.isBlank(getAutocomplete().getQuery())) {
return Collections.emptyList();
}
return getProjects();
}

/**
Expand All @@ -186,9 +184,6 @@ protected boolean include(HProject elem, String filter) {
@Getter
private final AbstractListFilter<HAccount> userTabUserFilter =
new InMemoryListFilter<HAccount>() {
private AccountDAO accountDAO = ServiceLocator.instance()
.getInstance(AccountDAO.class);

/**
* Fetches all records.
*
Expand All @@ -199,11 +194,7 @@ protected List<HAccount> fetchAll() {
if (StringUtils.isEmpty(getAutocomplete().getQuery())) {
return Collections.emptyList();
}
List<HAccount> hAccounts =
accountDAO.searchQuery(getAutocomplete().getQuery(),
-1, 0);
Collections.sort(hAccounts, userComparator);
return hAccounts;
return getAccounts();
}

/**
Expand All @@ -219,6 +210,39 @@ protected boolean include(HAccount elem, String filter) {
}
};

public List<HProject> getProjects() {
if (projects == null) {
ProjectDAO projectDAO =
ServiceLocator.instance().getInstance(ProjectDAO.class);
try {
projects = projectDAO.searchProjects(getAutocomplete()
.getQuery(), -1, 0, includeObsolete);
Collections.sort(projects,
ComparatorUtil.PROJECT_NAME_COMPARATOR);
} catch (ParseException e) {
return Collections.emptyList();
}
}
return projects;
}

public List<HAccount> getAccounts() {
if (accounts == null) {
AccountDAO accountDAO =
ServiceLocator.instance().getInstance(AccountDAO.class);

accounts = accountDAO.searchQuery(getAutocomplete().getQuery(),
-1, 0);
Collections.sort(accounts,
ComparatorUtil.ACCOUNT_NAME_COMPARATOR);
}
return accounts;
}

public int getVersionSize(String projectSlug) {
return projectIterationDAO.getByProjectSlug(projectSlug,
EntityStatus.ACTIVE, EntityStatus.READONLY).size();
}

public int getTotalProjectCount() {
if(StringUtils.isEmpty(getAutocomplete().getQuery())) {
Expand Down Expand Up @@ -252,10 +276,12 @@ public String formatDate(Date date) {
* Sort project list
*/
public void sortProjectList() {
Collections.sort(projects, projectComparator);
projectTabProjectFilter.reset();
}

public void sortUserList() {
Collections.sort(accounts, userComparator);
userTabUserFilter.reset();
}

Expand All @@ -278,10 +304,11 @@ public int compare(HProject o1, HProject o2) {
}

if (selectedSortOption.equals(SortingType.SortOption.CREATED_DATE)) {
return o1.getCreationDate().compareTo(o2.getCreationDate());
return ComparatorUtil.compareDate(o1.getCreationDate(),
o2.getCreationDate());
} else {
return o1.getName().toLowerCase().compareTo(
o2.getName().toLowerCase());
return ComparatorUtil.compareStringIgnoreCase(o1.getName(),
o2.getName());
}
}
}
Expand All @@ -303,8 +330,8 @@ public int compare(HAccount o1, HAccount o2) {
o1 = o2;
o2 = temp;
}
return o1.getPerson().getName().toLowerCase().compareTo(
o2.getPerson().getName().toLowerCase());
return ComparatorUtil.compareStringIgnoreCase(
o1.getPerson().getName(), o2.getPerson().getName());
}
}
}
63 changes: 51 additions & 12 deletions zanata-war/src/main/java/org/zanata/util/ComparatorUtil.java
Expand Up @@ -23,8 +23,11 @@
package org.zanata.util;

import java.util.Comparator;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.zanata.common.ProjectType;
import org.zanata.model.HAccount;
import org.zanata.model.HAccountRole;
import org.zanata.model.HLocale;
import org.zanata.model.HPerson;
Expand All @@ -49,22 +52,19 @@ public int compare(HLocale hLocale, HLocale hLocale2) {
new Comparator<HPerson>() {
@Override
public int compare(HPerson hPerson, HPerson hPerson2) {
return hPerson.getName().compareTo(hPerson2.getName());
}
return compareStringIgnoreCase(hPerson.getName(),
hPerson2.getName());
}
};

public static final Comparator<HProjectIteration> PROJECT_NAME_COMPARATOR =
public static final Comparator<HProjectIteration> VERSION_PROJECT_NAME_COMPARATOR =
new Comparator<HProjectIteration>() {
@Override
public int compare(HProjectIteration version1,
HProjectIteration version2) {
return version1
.getProject()
.getName()
.toLowerCase()
.compareTo(
version2.getProject().getName()
.toLowerCase());
return compareStringIgnoreCase(
version1.getProject().getName(),
version2.getProject().getName());
}
};

Expand All @@ -73,18 +73,28 @@ public int compare(HProjectIteration version1,
new Comparator<HProjectIteration>() {
@Override
public int compare(HProjectIteration o1, HProjectIteration o2) {
return o2.getCreationDate().compareTo(o1.getCreationDate());
return compareDate(o2.getCreationDate(),
o1.getCreationDate());
}
};

public static final Comparator<HProject> PROJECT_CREATION_DATE_COMPARATOR =
new Comparator<HProject>() {
@Override
public int compare(HProject o1, HProject o2) {
return o2.getCreationDate().compareTo(o1.getCreationDate());
return compareDate(o2.getCreationDate(),
o1.getCreationDate());
}
};

public static final Comparator<HProject> PROJECT_NAME_COMPARATOR =
new Comparator<HProject>() {
@Override
public int compare(HProject o1, HProject o2) {
return compareStringIgnoreCase(o1.getName(), o2.getName());
}
};

public static final Comparator<HAccountRole> ACCOUNT_ROLE_COMPARATOR =
new Comparator<HAccountRole>() {
@Override
Expand All @@ -106,4 +116,33 @@ public int compare(ProjectType o1, ProjectType o2) {
return o1.toString().compareTo(o2.toString());
}
};

public static final Comparator<HAccount> ACCOUNT_NAME_COMPARATOR =
new Comparator<HAccount>() {
@Override
public int compare(HAccount o1, HAccount o2) {
return compareStringIgnoreCase(o1.getPerson().getName(), o2
.getPerson().getName());
}
};

public static int compareDate(Date date1, Date date2) {
if (date1 == null) {
return -1;
}
if (date2 == null) {
return 1;
}
return date1.compareTo(date2);
}

public static final int compareStringIgnoreCase(String str1, String str2) {
if (StringUtils.isBlank(str1)) {
return -1;
}
if (StringUtils.isBlank(str2)) {
return 1;
}
return str1.toLowerCase().compareTo(str2.toLowerCase());
}
}
Expand Up @@ -59,7 +59,7 @@

<div class="list__item__meta">
<i class="i i--version"
title="#{msgs['jsf.Versions']}"></i> #{project.projectIterations.size}
title="#{msgs['jsf.Versions']}"></i> #{zanataSearch.getVersionSize(project.slug)}
</div>
</div>
<div class="list__item__actions">
Expand Down
Expand Up @@ -97,13 +97,13 @@ public void HProjectIterationProjectNameCompare() throws Exception {
HProjectIteration hProjectIteration3 = new HProjectIteration();
hProjectIteration3.setProject(hProject3);

assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR
assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR
.compare(hProjectIteration1, hProjectIteration1)).isEqualTo(0);
assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR
assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR
.compare(hProjectIteration2, hProjectIteration3)).isEqualTo(0);
assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR
assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR
.compare(hProjectIteration1, hProjectIteration3)).isEqualTo(-1);
assertThat(ComparatorUtil.PROJECT_NAME_COMPARATOR
assertThat(ComparatorUtil.VERSION_PROJECT_NAME_COMPARATOR
.compare(hProjectIteration3, hProjectIteration1)).isEqualTo(1);
}

Expand Down

0 comments on commit b6b166c

Please sign in to comment.