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

Commit

Permalink
project search autocomplete
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Dec 11, 2013
1 parent d4df44d commit 86865f3
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 13 deletions.
13 changes: 11 additions & 2 deletions zanata-war/src/main/java/org/zanata/action/ProjectSearch.java
Expand Up @@ -54,6 +54,9 @@ public class ProjectSearch implements Serializable {
@In
private ZanataIdentity identity;

// Count of result to be return as part of autocomplete
private final static int INITIAL_RESULT_COUNT = 5;

public void setCurrentPage(int page) {
if (page < 1)
this.currentPage = 1;
Expand All @@ -62,7 +65,7 @@ public void setCurrentPage(int page) {
}

/**
* Return first 5 results on project search
* Return results on project search
*
* @param query
*/
Expand All @@ -73,7 +76,8 @@ public List<SearchResult> suggestProjects(String query) {
return result;
}
try {
for (HProject project : projectDAO.searchQuery(searchQuery, 5, 0)) {
for (HProject project : projectDAO.searchQuery(searchQuery,
INITIAL_RESULT_COUNT, 0)) {
result.add(new SearchResult(project, searchQuery));
}
result.add(new SearchResult(searchQuery));
Expand Down Expand Up @@ -109,6 +113,11 @@ public boolean evaluate(Object arg0) {
resultSize = searchResults.size();
}

public String searchAndRedirect() {
search();
return "/search.xhtml";
}

@AllArgsConstructor
public class SearchResult {
@Getter
Expand Down
26 changes: 18 additions & 8 deletions zanata-war/src/main/java/org/zanata/dao/ProjectDAO.java
Expand Up @@ -7,9 +7,13 @@
import javax.annotation.Nullable;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.util.Version;
import org.hibernate.Query;
import org.hibernate.Session;
Expand Down Expand Up @@ -231,15 +235,21 @@ public int getTotalObsoleteProjectCount() {

public List<HProject> searchQuery(@Nonnull String searchQuery,
int maxResult, int firstResult) throws ParseException {
String[] projectFields = { "slug", "name", "description" };
QueryParser parser =
new MultiFieldQueryParser(Version.LUCENE_35, projectFields,
new StandardAnalyzer(Version.LUCENE_35));
parser.setAllowLeadingWildcard(true);
org.apache.lucene.search.Query luceneQuery =
parser.parse(QueryParser.escape(searchQuery));

searchQuery = QueryParser.escape(searchQuery);

PrefixQuery slugQuery = new PrefixQuery(new Term("slug", searchQuery));
PrefixQuery nameQuery = new PrefixQuery(new Term("name", searchQuery));
PrefixQuery descQuery =
new PrefixQuery(new Term("description", searchQuery));

BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(slugQuery, BooleanClause.Occur.SHOULD);
booleanQuery.add(nameQuery, BooleanClause.Occur.SHOULD);
booleanQuery.add(descQuery, BooleanClause.Occur.SHOULD);

FullTextQuery query =
entityManager.createFullTextQuery(luceneQuery, HProject.class);
entityManager.createFullTextQuery(booleanQuery, HProject.class);
query.setMaxResults(maxResult).setFirstResult(firstResult)
.getResultList();

Expand Down
36 changes: 33 additions & 3 deletions zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml
Expand Up @@ -4,7 +4,35 @@
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.org/schema/seam/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:zanata="http://java.sun.com/jsf/composite/zanata">
xmlns:zanata="http://java.sun.com/jsf/composite/zanata"
xmlns:a4j="http://richfaces.org/a4j">

<script type="text/javascript">
var searchField;
jQuery(document).ready(function () {
searchField = jQuery('.form--search__input');

//This should be remove once new-zanata prefix is removed
jQuery('#' + getSearchFieldResultId()).addClass("new-zanata");
});

function getSearchFieldResultId() {
var id = jQuery(searchField).attr('id');
return id.substring(0,
id.length - "Input".length).concat("List").replace(/:/g, "\\:");
}

function resizeSearchField() {
jQuery('#' +
getSearchFieldResultId()).find(".rf-au-lst-scrl").css("width",
jQuery(searchField).outerWidth() + "px");
}
</script>

<a4j:jsFunction name="redirectUrl"
action="#{projectSearch.searchAndRedirect()}">
<a4j:param name="val" assignTo="#{projectSearch.searchQuery}"/>
</a4j:jsFunction>

<h1 class="header__title">
<s:link view="/home.xhtml" propagation="none" id="home">
Expand All @@ -31,7 +59,8 @@
minChars="2" inputClass="form--search__input js-form--search__input"
styleClass="auto-complete" fetchValue="#{suggestProject.query}"
autocompleteMethod="#{projectSearch.suggestProjects}"
layout="list"
layout="list" onselectitem="redirectUrl(this.value);"
oncomplete="resizeSearchField()"
popupClass="auto-complete-list" id="form--search">
<rich:placeholder value="#{messages['jsf.SearchProjects']}"
styleClass="form__placeholder"/>
Expand All @@ -43,8 +72,9 @@
</s:link>

<s:link view="/search.xhtml" action="#{projectSearch.search}"
value="Search Zanata for '#{suggestProject.query}'"
rendered="#{suggestProject.isProjectNull()}">
<i class="i i--search"></i> Search Zanata for
'#{suggestProject.query}'
<f:param name="query" value="#{suggestProject.query}"/>
</s:link>
</rich:autocomplete>
Expand Down

0 comments on commit 86865f3

Please sign in to comment.