search.jsp revision 4aabae02a84501165f3a1375bd3610db1b222ce3
990d0e893f5b70e735cdf990af66e9ec6e91fa78Tinderbox UserCDDL HEADER START
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsThe contents of this file are subject to the terms of the
4a14ce5ba00ab7bc55c99ffdcf59c7a4ab902721Automatic UpdaterCommon Development and Distribution License (the "License").
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsYou may not use this file except in compliance with the License.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsSee LICENSE.txt included in this distribution for the specific
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewslanguage governing permissions and limitations under the License.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsWhen distributing Covered Code, include this CDDL HEADER in each
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfile and include the License file at LICENSE.txt.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsIf applicable, add the following below this CDDL HEADER, with the
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfields enclosed by brackets "[]" replaced with your own identifying
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsinformation: Portions Copyright [yyyy] [name of copyright owner]
ea94d370123a5892f6c47a97f21d1b28d44bb168Tinderbox UserCDDL HEADER END
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsCopyright 2010 Sun Microsystems, Inc. All rights reserved.
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsUse is subject to license terms.
e21a2904f02a03fa06b6db04d348f65fe9c67b2bMark Andrews--%><%@ page import = "javax.servlet.*,
0c6ada0a814f3c5417daa1654129bc2af56ed504Automatic Updaterorg.opensolaris.opengrok.index.IndexDatabase,
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsorg.apache.lucene.search.spell.LuceneDictionary,
0f52ea95d861c237da324aa0c009638298069ec0Tinderbox User%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsDate starttime = new Date();
eaaf00efc02fdd4965f747afb51f881ac5a389d2Tinderbox UserString defs = request.getParameter("defs");
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsString refs = request.getParameter("refs");
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsString hist = request.getParameter("hist");
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsString path = request.getParameter("path");
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews%><%@ include file="projects.jspf" %><%
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsString sort = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfinal String LASTMODTIME = "lastmodtime";
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfinal String RELEVANCY = "relevancy";
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsfinal String BY_PATH = "fullpath";
b2f07642fd712c8fda81a116bcdde229ab291f33Tinderbox Userfinal SortField S_BY_PATH = new SortField(BY_PATH,SortField.STRING);
b2f07642fd712c8fda81a116bcdde229ab291f33Tinderbox UserCookie[] cookies = request.getCookies();
c247e3f281613fabe1af362e9f3157e35ebbe52cMark Andrewsif (cookies != null) {
b2f07642fd712c8fda81a116bcdde229ab291f33Tinderbox User for (Cookie cookie : cookies) {
b2f07642fd712c8fda81a116bcdde229ab291f33Tinderbox User if (cookie.getName().equals("OpenGrok/sorting")) {
b2f07642fd712c8fda81a116bcdde229ab291f33Tinderbox User if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews sort = RELEVANCY;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsString sortParam = request.getParameter("sort");
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif (sortParam != null) {
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if (LASTMODTIME.equals(sortParam)) {
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews sort = LASTMODTIME;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews } else if (RELEVANCY.equals(sortParam)) {
eaaf00efc02fdd4965f747afb51f881ac5a389d2Tinderbox User sort = RELEVANCY;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews } else if (BY_PATH.equals(sortParam)) {
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews sort = BY_PATH;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if (sort != null) {
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews Cookie cookie = new Cookie("OpenGrok/sorting", sort);
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews} else { sort = RELEVANCY; }
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark AndrewsString errorMsg = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif( q!= null && q.equals("")) q = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif( defs != null && defs.equals("")) defs = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif( refs != null && refs.equals("")) refs = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif( hist != null && hist.equals("")) hist = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif( path != null && path.equals("")) path = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif (project != null && project.size()<1) project = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrewsif (q != null || defs != null || refs != null || hist != null || path != null) {
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews Searcher searcher = null; //the searcher used to open/search the index
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews TopScoreDocCollector collector=null; // the collector used
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews ScoreDoc[] hits = null; // list of documents which result from the query
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews IndexReader ireader = null; //the reader used to open/search the index
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews Query query = null, defQuery = null; //the Query created by the QueryParser
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews boolean allCollected=false;
1224c3b69b3d18f7127aa042644936af25a2d679Mark Andrews int totalHits=0;
1224c3b69b3d18f7127aa042644936af25a2d679Mark Andrews int start = 0; //the first index displayed on this page
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews //TODO deprecate max this and merge with paging and param n - TEST needed
1224c3b69b3d18f7127aa042644936af25a2d679Mark Andrews //int max = 25; //the maximum items displayed on this page
b2f07642fd712c8fda81a116bcdde229ab291f33Tinderbox User int max=RuntimeEnvironment.getInstance().getHitsPerPage();
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews int cachePages= RuntimeEnvironment.getInstance().getCachePages();
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews final boolean docsScoredInOrder=false;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews int thispage = 0; //used for the for/next either max or
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews String moreUrl = null;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews CompatibleAnalyser analyzer = new CompatibleAnalyser();
d3ddafd7469d1f3430ccd1b0fe0d13ccbbaf5debTinderbox User String qstr = "";
d3ddafd7469d1f3430ccd1b0fe0d13ccbbaf5debTinderbox User String result = "";
d3ddafd7469d1f3430ccd1b0fe0d13ccbbaf5debTinderbox User String DATA_ROOT = env.getDataRootPath();
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews File data_root = new File(DATA_ROOT);
c247e3f281613fabe1af362e9f3157e35ebbe52cMark Andrews throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
c247e3f281613fabe1af362e9f3157e35ebbe52cMark Andrews //String date = request.getParameter("date");
c247e3f281613fabe1af362e9f3157e35ebbe52cMark Andrews //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews start = Integer.parseInt(request.getParameter("start")); //parse the max results first
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews max = Integer.parseInt(request.getParameter("n")); //then the start index
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
c247e3f281613fabe1af362e9f3157e35ebbe52cMark Andrews if(start < 0 ) start = 0;
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews } catch (Exception e) { }
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews qstr = Util.buildQueryString(q, defs, refs, path, hist);
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews QueryParser qparser = new QueryParser(SearchEngine.LUCENE_VERSION,"full", analyzer);
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews query = qparser.parse(qstr); //parse the
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
5a4557e8de2951a2796676b5ec4b6a90caa5be14Mark Andrews if (RuntimeEnvironment.getInstance().hasProjects()) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (project == null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User errorMsg = "<b>Error:</b> You must select a project!";
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (project.size() > 1) { //more projects
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User IndexSearcher[] searchables = new IndexSearcher[project.size()];
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for (String proj : project) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User ireader = (IndexReader.open(FSDirectory.open(new File(droot, proj)),true));
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User searchables[ii++] = new IndexSearcher(ireader);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (Runtime.getRuntime().availableProcessors() > 1) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User searcher = new ParallelMultiSearcher(searchables);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User searcher = new MultiSearcher(searchables);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } else { // just 1 project selected
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User root = new File(root, project.get(0));
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User ireader = IndexReader.open(FSDirectory.open(root),true);
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User searcher = new IndexSearcher(ireader);
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User } else { //no project setup
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User ireader = IndexReader.open(FSDirectory.open(root),true);
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User searcher = new IndexSearcher(ireader);
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User //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 ;)
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User if (errorMsg == null) {
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User collector = TopScoreDocCollector.create(hitsPerPage*cachePages,docsScoredInOrder);
4f9cb7bd58e2c0a7407fee3758ea265aee329ac6Tinderbox User Sort sortf = new Sort(new SortField("date",SortField.STRING,true));
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User fdocs=searcher.search(query, null, totalHits, sortf);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User allCollected=true;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } else if (BY_PATH.equals(sort)) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Sort sortf = new Sort(S_BY_PATH);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User fdocs=searcher.search(query, null,totalHits, sortf);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User allCollected=true;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User searcher.search(query,collector);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User collector = TopScoreDocCollector.create(totalHits,docsScoredInOrder);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User searcher.search(query,collector);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User allCollected=true;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User hits=collector.topDocs().scoreDocs;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User //below will get all the documents
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User// for (int i = 0; i < hits.length; i++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User// int docId = hits[i].doc;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User// Document d = searcher.doc(docId);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User thispage = max;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User errorMsg = "<b>Error:</b> Too many results for wildcard!";
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (ParseException e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User errorMsg = "<b>Error parsing your query:</b><br/>" + Util.htmlize(qstr) +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User "<p/>You might try to enclose your search term in quotes: <br/>" +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User "<a href=search?q=\"" + Util.URIEncode(qstr) + "\">\"" + Util.htmlize(qstr) +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User "\"</a><p/> or read the <a href=\"help.jsp\">Help</a> on query language(eventually <a href=\"help.jsp#escaping\">escape special characters</a> with <b>\\</b>)<p/>" +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (FileNotFoundException e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User errorMsg = "<b>Error:</b> Index database not found";
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (Exception e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User // Bug #3900: Check if this is a search for a single term, and that term
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User // is a definition. If that's the case, and we only have one match, we'll
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User // generate a direct link instead of a listing.
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User boolean isSingleDefinitionSearch =
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User (query instanceof TermQuery) && (defs != null);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User // Attempt to create a direct link to the definition if we search for one
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User // single definition term AND we have exactly one match AND there is only
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User // one definition of that symbol in the document that matches.
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User boolean uniqueDefinition = false;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (isSingleDefinitionSearch && hits != null && hits.length == 1) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Document doc = searcher.doc(hits[0].doc);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User byte[] rawTags = doc.getFieldable("tags").getBinaryValue();
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Definitions tags = Definitions.deserialize(rawTags);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String symbol = ((TermQuery) query).getTerm().text();
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (tags.occurrences(symbol) == 1) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User uniqueDefinition = true;
f2016fcecf098726740507a5522dca04c49aeb82Tinderbox User // @TODO fix me. I should try to figure out where the exact hit is instead
f2016fcecf098726740507a5522dca04c49aeb82Tinderbox User // of returning a page with just _one_ entry in....
f2016fcecf098726740507a5522dca04c49aeb82Tinderbox User if (uniqueDefinition && request.getServletPath().equals("/s")) {
f2016fcecf098726740507a5522dca04c49aeb82Tinderbox User String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
f2016fcecf098726740507a5522dca04c49aeb82Tinderbox User String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User StringBuilder url = new StringBuilder(preFragmentPath);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String pageTitle = "Search";
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><%@ include file="httpheader.jspf" %>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User<div id="page">
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <div id="header"><%@ include file="pageheader.jspf" %></div>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User<div id="Masthead"></div>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User<div id="bar">
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String url = "search?";
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User url = url + (q == null ? "" : "&q=" + Util.URIEncode(q)) +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User (path == null ? "" : "&path=" + Util.URIEncode(path)) +
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User (hist == null ? "" : "&hist=" + Util.URIEncode(hist));
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (hasProjects) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (project!=null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User url = url + "&project=";
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for (Iterator it = project.iterator(); it.hasNext();) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %>Sort by: <%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User url=url+("&sort=");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (sort == null || RELEVANCY.equals(sort)) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } else if (LASTMODTIME.equals(sort)) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } else if (BY_PATH.equals(sort)) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } %></td></tr></table>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User<div id="menu">
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <%@ include file="menu.jspf"%>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User<div id="results">
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User//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
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox Userif( hits == null || errorMsg != null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><%=errorMsg%><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } else if (hits.length == 0) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User File spellIndex = new File(env.getDataRootPath(), "spellIndex");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User File[] spellIndexes=null;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (RuntimeEnvironment.getInstance().hasProjects()) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (project.size() > 1) { //more projects
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User spellIndexes = new File[project.size()];
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for (String proj : project) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User spellIndexes[ii++] = new File(spellIndex,proj);
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User } else { // just 1 project selected
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User spellIndex = new File(spellIndex, project.get(0));
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (spellIndexes!=null) {count=spellIndexes.length;}
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for (int idx = 0; idx < count; idx++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (spellIndexes!=null) spellIndex = spellIndexes[idx];
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User FSDirectory spellDirectory = FSDirectory.open(spellIndex);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User SpellChecker checker = new SpellChecker(spellDirectory);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Date sstart = new Date();
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User boolean printHeader = true;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String[] toks;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(q != null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User toks = q.split("[\t ]+");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(toks != null){
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for(int j=0; j<toks.length; j++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(toks[j].length() > 3) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for(int i = 0;i < ret.length; i++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (printHeader) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User printHeader = false;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> <%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(refs != null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User toks = refs.split("[\t ]+");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(toks != null){
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for(int j=0; j<toks.length; j++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(toks[j].length() > 3) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
5fa6a064b8301e4f274bd132fd577def59e4fb4cTinderbox User for(int i = 0;i < ret.length; i++) {
5fa6a064b8301e4f274bd132fd577def59e4fb4cTinderbox User if (printHeader) {
5fa6a064b8301e4f274bd132fd577def59e4fb4cTinderbox User %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User printHeader = false;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %> <a href=search?refs=<%=ret[i]%>><%=ret[i]%></a> <%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User //TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(defs != null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User toks = defs.split("[\t ]+");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(toks != null){
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for(int j=0; j<toks.length; j++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(toks[j].length() > 3) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User for(int i = 0;i < ret.length; i++) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (printHeader) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User printHeader = false;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %> <a href=search?defs=<%=ret[i]%>><%=ret[i]%></a> <%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (printHeader) {
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User %><p> Your search <b><%=query.toString()%></b> did not match any files.
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User Suggestions:<br/><blockquote>- Make sure all terms are spelled correctly.<br/>
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User - Try different keywords.<br/>
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User - Try more general keywords.<br/>
6478b87fd23bcd3ab74c25b261021fe19a239c4fTinderbox User - Use 'wil*' cards if you are looking for partial match.
6478b87fd23bcd3ab74c25b261021fe19a239c4fTinderbox User </blockquote>
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User } else { // We have a lots of results to show
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User StringBuilder slider = null;
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User if ( max < totalHits) {
6478b87fd23bcd3ab74c25b261021fe19a239c4fTinderbox User if((start + max) < totalHits) {
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User thispage = max;
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User thispage = totalHits - start;
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User String urlp = (q == null ? "" : "&q=" + Util.URIEncode(q)) +
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
6478b87fd23bcd3ab74c25b261021fe19a239c4fTinderbox User (path == null ? "" : "&path=" + Util.URIEncode(path)) +
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User (hist == null ? "" : "&hist=" + Util.URIEncode(hist)) +
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User (sort == null ? "" : "&sort=" + Util.URIEncode(sort));
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User if (hasProjects) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User urlp = urlp + "&project=";
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User for (Iterator it = project.iterator(); it.hasNext();) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User urlp = urlp + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User slider = new StringBuilder();
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User int labelStart =1;
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User int sstart = start - max* (start / max % 10 + 1) ;
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User if(sstart < 0) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User labelStart = 1;
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User labelStart = sstart/max + 1;
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User int label = labelStart;
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User int labelEnd = label + 11;
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User for(int i=sstart; i<totalHits && label <= labelEnd; i+= max) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User if (i <= start && start < i+ max) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User slider.append("<span class=\"sel\">" + label + "</span>");
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User if(label == labelStart && label != 1) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User arr = "<<";
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User } else if(label == labelEnd && i < totalHits) {
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User arr = ">>";
61ab11c0ec845606f85452b2c9f2e223772aae00Tinderbox User arr = label < 10 ? " " + label : String.valueOf(label);
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User slider.append("<a class=\"more\" href=\"s?n=" + max + "&start=" + i + urlp + "\">"+
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User arr + "</a>");
f5c27ecceb6dcba6ad8b75172fe5f9823d7a6d42Tinderbox User thispage = totalHits - start; // set the max index to max or last
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %> Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <%=thispage+start%></b> of <b><%=totalHits%></b>) sorted by <%=sort%> <p><%=slider != null ?
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <table width="100%" cellpadding="3" cellspacing="0" border="0"><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Context sourceContext = null;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Summarizer summer = null;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (query != null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User sourceContext = new Context(query);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(sourceContext != null)
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User summer = new Summarizer(query, analyzer);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (Exception e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User HistoryContext historyContext = null;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User historyContext = new HistoryContext(query);
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (Exception e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User EftarFileReader ef = null;
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User ef = new EftarFileReader(env.getDataRootPath() + "/index/dtags.eftar");
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (Exception e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User //TODO also fix the way what and how it is passed to prettyprint, can improve performance! SearchEngine integration is really needed here.
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User Results.prettyPrintHTML(searcher,hits, start, start+thispage,
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User sourceContext, historyContext, summer,
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User context + "/xref",
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User context + "/more",
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if(ef != null) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User } catch (IOException e) {
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %></table><br/>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User <%=slider != null ? "<p>" + slider + "</p>" : ""%>
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User %><br/></div><%@include file="foot.jspf"%><%
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User if (ireader != null)
0ccb0e98c77a9b9636a036f8f64f5679a430aaf4Tinderbox User} else { // Entry page show the map