search.jsp revision 1164
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenCDDL HEADER START
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenThe contents of this file are subject to the terms of the
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenCommon Development and Distribution License (the "License").
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenYou may not use this file except in compliance with the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenSee LICENSE.txt included in this distribution for the specific
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenlanguage governing permissions and limitations under the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenWhen distributing Covered Code, include this CDDL HEADER in each
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenfile and include the License file at LICENSE.txt.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenIf applicable, add the following below this CDDL HEADER, with the
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenfields enclosed by brackets "[]" replaced with your own identifying
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Siraineninformation: Portions Copyright [yyyy] [name of copyright owner]
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenCDDL HEADER END
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenCopyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen--%><%@ page import = "javax.servlet.*,
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainenorg.apache.lucene.search.spell.LuceneDictionary,
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%--
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen--%><%@ include file="projects.jspf" %><%
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenDate starttime = new Date();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenString defs = request.getParameter("defs");
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenString refs = request.getParameter("refs");
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenString hist = request.getParameter("hist");
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenString path = request.getParameter("path");
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenString sort = null;
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainenfinal String LASTMODTIME = "lastmodtime";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenfinal String RELEVANCY = "relevancy";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenfinal String BY_PATH = "fullpath";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenfinal SortField S_BY_PATH = new SortField(BY_PATH,SortField.STRING);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo SirainenCookie[] cookies = request.getCookies();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif (cookies != null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (Cookie cookie : cookies) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (cookie.getName().equals("OpenGrokSorting")) {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen sort = RELEVANCY;
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenString sortParam = request.getParameter("sort");
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainenif (sortParam != null) {
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen if (LASTMODTIME.equals(sortParam)) {
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen sort = LASTMODTIME;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else if (RELEVANCY.equals(sortParam)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sort = RELEVANCY;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else if (BY_PATH.equals(sortParam)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sort = BY_PATH;
f99575e1d6cd251bd7b6d0654bd75b475e6a894cTimo Sirainen if (sort != null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Cookie cookie = new Cookie("OpenGrokSorting", sort);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen} else { sort = RELEVANCY; }
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo SirainenString errorMsg = null;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif( q!= null && q.equals("")) q = null;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif( defs != null && defs.equals("")) defs = null;
f99575e1d6cd251bd7b6d0654bd75b475e6a894cTimo Sirainenif( refs != null && refs.equals("")) refs = null;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif( hist != null && hist.equals("")) hist = null;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif( path != null && path.equals("")) path = null;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif (project != null && project.size()<1) project = null;
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainenif (q != null || defs != null || refs != null || hist != null || path != null) {
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen Searcher searcher = null; //the searcher used to open/search the index
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen ScoreDoc[] hits = null; // list of documents which result from the query
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen Query query = null; //the Query created by the QueryBuilder
0add8c99ca65e56dbf613595fc37c41aafff3f7fTimo Sirainen int totalHits=0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int start = 0; //the first index displayed on this page
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen //TODO deprecate max this and merge with paging and param n - TEST needed
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen //int max = 25; //the maximum items displayed on this page
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int max=RuntimeEnvironment.getInstance().getHitsPerPage();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int thispage = 0; //used for the for/next either max or
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen QueryBuilder queryBuilder =
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen new QueryBuilder()
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .setFreetext(q).setDefs(defs).setRefs(refs)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen .setPath(path).setHist(hist);
93b29720c5141f787bd1861796867e4595c9d084Timo Sirainen String DATA_ROOT = env.getDataRootPath();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen File data_root = new File(DATA_ROOT);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen //String date = request.getParameter("date");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen start = Integer.parseInt(request.getParameter("start")); //parse the max results first
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen max = Integer.parseInt(request.getParameter("n")); //then the start index
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if(start < 0 ) start = 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } catch (Exception e) { }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (RuntimeEnvironment.getInstance().hasProjects()) {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen if (project == null) {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen errorMsg = "<b>Error:</b> You must select a project!";
f99575e1d6cd251bd7b6d0654bd75b475e6a894cTimo Sirainen if (project.size() > 1) { //more projects
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen IndexSearcher[] searchables = new IndexSearcher[project.size()];
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (String proj : project) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen FSDirectory dir = FSDirectory.open(new File(droot, proj));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen searchables[ii++] = new IndexSearcher(dir);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (Runtime.getRuntime().availableProcessors() > 1) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen searcher = new ParallelMultiSearcher(searchables);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen searcher = new MultiSearcher(searchables);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else { // just 1 project selected
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen root = new File(root, project.get(0));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen FSDirectory dir = FSDirectory.open(root);
f99575e1d6cd251bd7b6d0654bd75b475e6a894cTimo Sirainen searcher = new IndexSearcher(dir);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else { //no project setup
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen FSDirectory dir = FSDirectory.open(root);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen searcher = new IndexSearcher(dir);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen //TODO check if below is somehow reusing sessions so we don't requery again and again, I guess 2min timeout sessions could be usefull, since you click on the next page within 2mins, if not, then wait ;)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (errorMsg == null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sortf = new Sort(new SortField("date", SortField.STRING, true));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else if (BY_PATH.equals(sort)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sortf = new Sort(S_BY_PATH);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen TopFieldDocs fdocs = searcher.search(query, null, start + max, sortf);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen thispage = max;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen errorMsg = "<b>Error:</b> Too many results for wildcard!";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } catch (ParseException e) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen errorMsg = "<b>Error parsing your query</b>" +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "<p/>You might try to enclose your search term in quotes, " +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "<a href=\"help.jsp#escaping\">escape special characters</a> " +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "with <b>\\</b>, or read the <a href=\"help.jsp\">Help</a> " +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "on the query language.<p/>" +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } catch (FileNotFoundException e) {
f99575e1d6cd251bd7b6d0654bd75b475e6a894cTimo Sirainen errorMsg = "<b>Error:</b> Index database not found";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } catch (Exception e) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // Bug #3900: Check if this is a search for a single term, and that term
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // is a definition. If that's the case, and we only have one match, we'll
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // generate a direct link instead of a listing.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen boolean isSingleDefinitionSearch =
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (query instanceof TermQuery) && (defs != null);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // Attempt to create a direct link to the definition if we search for one
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // single definition term AND we have exactly one match AND there is only
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // one definition of that symbol in the document that matches.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen boolean uniqueDefinition = false;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (isSingleDefinitionSearch && hits != null && hits.length == 1) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Document doc = searcher.doc(hits[0].doc);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (doc.getFieldable("tags")!=null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen byte[] rawTags = doc.getFieldable("tags").getBinaryValue();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Definitions tags = Definitions.deserialize(rawTags);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen String symbol = ((TermQuery) query).getTerm().text();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (tags.occurrences(symbol) == 1) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uniqueDefinition = true;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // @TODO fix me. I should try to figure out where the exact hit is instead
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen // of returning a page with just _one_ entry in....
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (uniqueDefinition && request.getServletPath().equals(Constants.searchR)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen String preFragmentPath = Util.URIEncodePath(context + Constants.xrefP + searcher.doc(hits[0].doc).get("path"));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen StringBuilder url = new StringBuilder(preFragmentPath);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen String pageTitle = "Search";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen %><%@ include file="httpheader.jspf" %>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen<div id="page">
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen <div id="header"><%@ include file="pageheader.jspf" %></div>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen<div id="Masthead"></div>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen<div id="bar">
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen <table border="0" width="100%"><tr><td><a href="<%=context%>/" id="home">Home</a></td><td align="right"><%
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen String url = "search?";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen url = url + (q == null ? "" : "&q=" + Util.URIEncode(q)) +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (path == null ? "" : "&path=" + Util.URIEncode(path)) +
f99575e1d6cd251bd7b6d0654bd75b475e6a894cTimo Sirainen (hist == null ? "" : "&hist=" + Util.URIEncode(hist));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (hasProjects) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (project!=null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen url = url + "&project=";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (Iterator it = project.iterator(); it.hasNext();) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen %>Sort by: <%
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen url=url+("&sort=");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (sort == null || RELEVANCY.equals(sort)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else if (LASTMODTIME.equals(sort)) {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen } else if (BY_PATH.equals(sort)) {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } %></td></tr></table>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen<div id="menu">
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen <%@ include file="menu.jspf"%>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen<div id="results">
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen//TODO spellchecking cycle below is not that great and we only create suggest links for every token in query, not for a query as whole
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenif( hits == null || errorMsg != null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen %><%=errorMsg%><%
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else if (hits.length == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen File spellIndex = new File(env.getDataRootPath(), "spellIndex");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen File[] spellIndexes=null;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (RuntimeEnvironment.getInstance().hasProjects()) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (project.size() > 1) { //more projects
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen spellIndexes = new File[project.size()];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (String proj : project) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen spellIndexes[ii++] = new File(spellIndex,proj);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else { // just 1 project selected
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen spellIndex = new File(spellIndex, project.get(0));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (spellIndexes!=null) {count=spellIndexes.length;}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (int idx = 0; idx < count; idx++) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (spellIndexes!=null) spellIndex = spellIndexes[idx];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen FSDirectory spellDirectory = FSDirectory.open(spellIndex);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen SpellChecker checker = new SpellChecker(spellDirectory);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen Date sstart = new Date();
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen boolean printHeader = true;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen String[] toks;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if(q != null) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen toks = q.split("[\t ]+");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if(toks != null){
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
for(int i = 0;i < ret.length; i++) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
toks = refs.split("[\t ]+");
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
for(int i = 0;i < ret.length; i++) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
//TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
toks = defs.split("[\t ]+");
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
for(int i = 0;i < ret.length; i++) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
%><p> Your search <b><%=query.toString()%></b> did not match any files.
String urlp = (q == null ? "" : "&q=" + Util.URIEncode(q)) +
(defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
(refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
(path == null ? "" : "&path=" + Util.URIEncode(path)) +
(hist == null ? "" : "&hist=" + Util.URIEncode(hist)) +
(sort == null ? "" : "&sort=" + Util.URIEncode(sort));
labelStart = sstart/max + 1;
slider.append("<span class=\"sel\">" + label + "</span>");
arr = label < 10 ? " " + label : String.valueOf(label);
slider.append("<a class=\"more\" href=\"s?n=" + max + "&start=" + i + urlp + "\">"+
%> Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
slider.toString(): ""%></p>
new Context(query, queryBuilder.getQueries());
//TODO also fix the way what and how it is passed to prettyprint, can improve performance! SearchEngine integration is really needed here.
Results.prettyPrintHTML(searcher,hits, start, start+thispage,
ef.close();
<b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
%><br/></div><%@include file="foot.jspf"%><%