search.jsp revision 986
cd348e325366620fe047edcc849e3c9424828599Peter Bray<%--
cd348e325366620fe047edcc849e3c9424828599Peter BrayCDDL HEADER START
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco
cd348e325366620fe047edcc849e3c9424828599Peter BrayThe contents of this file are subject to the terms of the
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayCommon Development and Distribution License (the "License").
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalYou may not use this file except in compliance with the License.
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BraySee LICENSE.txt included in this distribution for the specific
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Braylanguage governing permissions and limitations under the License.
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos KoscoWhen distributing Covered Code, include this CDDL HEADER in each
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayfile and include the License file at LICENSE.txt.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayIf applicable, add the following below this CDDL HEADER, with the
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayfields enclosed by brackets "[]" replaced with your own identifying
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Brayinformation: Portions Copyright [yyyy] [name of copyright owner]
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayCDDL HEADER END
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayCopyright 2010 Sun Microsystems, Inc. All rights reserved.
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter BrayUse is subject to license terms.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray--%><%@ page import = "javax.servlet.*,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayjava.lang.Integer,
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotaljavax.servlet.http.*,
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotaljava.util.Hashtable,
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotaljava.util.Vector,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayjava.util.Date,
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscojava.util.ArrayList,
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscojava.util.List,
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscojava.lang.*,
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscojava.io.*,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayjava.io.StringReader,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayorg.opensolaris.opengrok.analysis.*,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayorg.opensolaris.opengrok.index.IndexDatabase,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayorg.opensolaris.opengrok.search.*,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayorg.opensolaris.opengrok.web.*,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.opensolaris.opengrok.search.context.*,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.opensolaris.opengrok.configuration.*,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayorg.apache.lucene.search.spell.LuceneDictionary,
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Brayorg.apache.lucene.search.spell.SpellChecker,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.apache.lucene.search.SortField,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.apache.lucene.search.TopScoreDocCollector,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.apache.lucene.store.FSDirectory,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.apache.lucene.analysis.*,
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalorg.apache.lucene.document.*,
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalorg.apache.lucene.index.*,
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotalorg.apache.lucene.search.*,
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotalorg.apache.lucene.queryParser.*"
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotal%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
65df1e87266301e243dcead8082ca6255abea666Vladimir KotalDate starttime = new Date();
65df1e87266301e243dcead8082ca6255abea666Vladimir KotalString q = request.getParameter("q");
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir KotalString defs = request.getParameter("defs");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString refs = request.getParameter("refs");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString hist = request.getParameter("hist");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString path = request.getParameter("path");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal%><%@ include file="projects.jspf" %><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume SmetString sort = null;
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet
56c25decc0427c204cd35856e521ddf28337e75dLubos Koscofinal String LASTMODTIME = "lastmodtime";
56c25decc0427c204cd35856e521ddf28337e75dLubos Koscofinal String RELEVANCY = "relevancy";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalfinal String BY_PATH = "fullpath";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalfinal SortField S_BY_PATH = new SortField(BY_PATH,SortField.STRING);
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalCookie[] cookies = request.getCookies();
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalif (cookies != null) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal for (Cookie cookie : cookies) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal if (cookie.getName().equals("OpenGrok/sorting")) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal sort = cookie.getValue();
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina sort = RELEVANCY;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal }
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal break;
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco }
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco }
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco}
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos KoscoString sortParam = request.getParameter("sort");
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotalif (sortParam != null) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray if (LASTMODTIME.equals(sortParam)) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray sort = LASTMODTIME;
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray } else if (RELEVANCY.equals(sortParam)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray sort = RELEVANCY;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco } else if (BY_PATH.equals(sortParam)) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal sort = BY_PATH;
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal }
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (sort != null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray Cookie cookie = new Cookie("OpenGrok/sorting", sort);
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco response.addCookie(cookie);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray} else { sort = RELEVANCY; }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString errorMsg = null;
43dac746513591adbd09bc4f417feb385f4fd87eVladimir Kotal
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif( q!= null && q.equals("")) q = null;
3a4816d2417e1abe89a913616de36f200793bea3Vladimir Kotalif( defs != null && defs.equals("")) defs = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif( refs != null && refs.equals("")) refs = null;
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotalif( hist != null && hist.equals("")) hist = null;
3a4816d2417e1abe89a913616de36f200793bea3Vladimir Kotalif( path != null && path.equals("")) path = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif (project != null && project.size()<1) project = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif (q != null || defs != null || refs != null || hist != null || path != null) {
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco Searcher searcher = null; //the searcher used to open/search the index
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco TopScoreDocCollector collector=null; // the collector used
f21b682cd9b414738a4f5a38b56f6682e537e1d2Trond Norbye ScoreDoc[] hits = null; // list of documents which result from the query
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco IndexReader ireader = null; //the reader used to open/search the index
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco Query query = null; //the Query created by the QueryBuilder
cd348e325366620fe047edcc849e3c9424828599Peter Bray boolean allCollected=false;
cd348e325366620fe047edcc849e3c9424828599Peter Bray int totalHits=0;
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray int start = 0; //the first index displayed on this page
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray //TODO deprecate max this and merge with paging and param n - TEST needed
cd348e325366620fe047edcc849e3c9424828599Peter Bray //int max = 25; //the maximum items displayed on this page
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal int max=RuntimeEnvironment.getInstance().getHitsPerPage();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal int cachePages= RuntimeEnvironment.getInstance().getCachePages();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal final boolean docsScoredInOrder=false;
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco int thispage = 0; //used for the for/next either max or
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal QueryBuilder queryBuilder =
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco new QueryBuilder()
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco .setFreetext(q).setDefs(defs).setRefs(refs)
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray .setPath(path).setHist(hist);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray try {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String DATA_ROOT = env.getDataRootPath();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(DATA_ROOT.equals("")) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File data_root = new File(DATA_ROOT);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(!data_root.isDirectory()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray //String date = request.getParameter("date");
cd348e325366620fe047edcc849e3c9424828599Peter Bray try {
cd348e325366620fe047edcc849e3c9424828599Peter Bray //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray start = Integer.parseInt(request.getParameter("start")); //parse the max results first
cd348e325366620fe047edcc849e3c9424828599Peter Bray max = Integer.parseInt(request.getParameter("n")); //then the start index
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(start < 0 ) start = 0;
cd348e325366620fe047edcc849e3c9424828599Peter Bray } catch (Exception e) { }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray query = queryBuilder.build();
cd348e325366620fe047edcc849e3c9424828599Peter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray "index");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco if (RuntimeEnvironment.getInstance().hasProjects()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (project == null) {
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco errorMsg = "<b>Error:</b> You must select a project!";
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray } else {
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco if (project.size() > 1) { //more projects
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray IndexSearcher[] searchables = new IndexSearcher[project.size()];
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray int ii = 0;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for (String proj : project) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray ireader = (IndexReader.open(FSDirectory.open(new File(droot, proj)),true));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray searchables[ii++] = new IndexSearcher(ireader);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (Runtime.getRuntime().availableProcessors() > 1) {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco searcher = new ParallelMultiSearcher(searchables);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray searcher = new MultiSearcher(searchables);
5e6c91d7e77062129cd0b6ac8aaa546dff216419Lubos Kosco }
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal } else { // just 1 project selected
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal root = new File(root, project.get(0));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ireader = IndexReader.open(FSDirectory.open(root),true);
cd348e325366620fe047edcc849e3c9424828599Peter Bray searcher = new IndexSearcher(ireader);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray } else { //no project setup
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ireader = IndexReader.open(FSDirectory.open(root),true);
cd348e325366620fe047edcc849e3c9424828599Peter Bray searcher = new IndexSearcher(ireader);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray //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 ;)
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (errorMsg == null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray collector = TopScoreDocCollector.create(hitsPerPage*cachePages,docsScoredInOrder);
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal if (LASTMODTIME.equals(sort)) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal Sort sortf = new Sort(new SortField("date",SortField.STRING,true));
cd348e325366620fe047edcc849e3c9424828599Peter Bray TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray totalHits=fdocs.totalHits;
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray fdocs=searcher.search(query, null, totalHits, sortf);
cd348e325366620fe047edcc849e3c9424828599Peter Bray allCollected=true;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray hits = fdocs.scoreDocs;
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco } else if (BY_PATH.equals(sort)) {
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco Sort sortf = new Sort(S_BY_PATH);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
d7c1415de39f4b07c85828f49cd1ee7a2a19eb9eLubos Kosco totalHits=fdocs.totalHits;
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco fdocs=searcher.search(query, null,totalHits, sortf);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco allCollected=true;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal hits = fdocs.scoreDocs;
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } else {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal searcher.search(query,collector);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal totalHits=collector.getTotalHits();
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal collector = TopScoreDocCollector.create(totalHits,docsScoredInOrder);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal searcher.search(query,collector);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal allCollected=true;
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray hits=collector.topDocs().scoreDocs;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco //below will get all the documents
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// for (int i = 0; i < hits.length; i++) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// int docId = hits[i].doc;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// Document d = searcher.doc(docId);
cd348e325366620fe047edcc849e3c9424828599Peter Bray// docs.add(d);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray thispage = max;
cd348e325366620fe047edcc849e3c9424828599Peter Bray } catch (BooleanQuery.TooManyClauses e) {
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal errorMsg = "<b>Error:</b> Too many results for wildcard!";
e9dbb478e3339d96ce4f0af5c6ab7e1d35ebb86dVladimir Kotal } catch (ParseException e) {
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal errorMsg = "<b>Error parsing your query</b>" +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "<p/>You might try to enclose your search term in quotes, " +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "<a href=\"help.jsp#escaping\">escape special characters</a> " +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "with <b>\\</b>, or read the <a href=\"help.jsp\">Help</a> " +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "on the query language.<p/>" +
cd348e325366620fe047edcc849e3c9424828599Peter Bray "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (FileNotFoundException e) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray errorMsg = "<b>Error:</b> Index database not found";
cd348e325366620fe047edcc849e3c9424828599Peter Bray } catch (Exception e) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal // Bug #3900: Check if this is a search for a single term, and that term
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal // is a definition. If that's the case, and we only have one match, we'll
4f3c0816485669143aa54f1c6461fcb47cf5bc5cVladimir Kotal // generate a direct link instead of a listing.
4f3c0816485669143aa54f1c6461fcb47cf5bc5cVladimir Kotal boolean isSingleDefinitionSearch =
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco (query instanceof TermQuery) && (defs != null);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray // Attempt to create a direct link to the definition if we search for one
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed // single definition term AND we have exactly one match AND there is only
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed // one definition of that symbol in the document that matches.
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed boolean uniqueDefinition = false;
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco if (isSingleDefinitionSearch && hits != null && hits.length == 1) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray Document doc = searcher.doc(hits[0].doc);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray byte[] rawTags = doc.getFieldable("tags").getBinaryValue();
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray Definitions tags = Definitions.deserialize(rawTags);
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco String symbol = ((TermQuery) query).getTerm().text();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (tags.occurrences(symbol) == 1) {
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco uniqueDefinition = true;
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco }
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco }
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco // @TODO fix me. I should try to figure out where the exact hit is instead
cd348e325366620fe047edcc849e3c9424828599Peter Bray // of returning a page with just _one_ entry in....
b17cb0705d90907337b3528aa7b8ed1700806f26Vladimir Kotal if (uniqueDefinition && request.getServletPath().equals("/s")) {
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
8f8c3f4555e5aa3160f03f2e9c55ddbd3381357bLubos Kosco
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal StringBuilder url = new StringBuilder(preFragmentPath);
8f8c3f4555e5aa3160f03f2e9c55ddbd3381357bLubos Kosco url.append("#");
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray url.append(fragment);
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco response.sendRedirect(url.toString());
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco } else {
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco String pageTitle = "Search";
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco environment.register();
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray %><%@ include file="httpheader.jspf" %>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<body>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<div id="page">
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco <div id="header"><%@ include file="pageheader.jspf" %></div>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<div id="Masthead"></div>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<div id="bar">
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String url = "search?";
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray url = url + (q == null ? "" : "&amp;q=" + Util.URIEncode(q)) +
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray (defs == null ? "" : "&amp;defs=" + Util.URIEncode(defs)) +
1a5c2ab40bd94d2b2c63afda767ce7bbf29ecc4bJan Friedel (refs == null ? "" : "&amp;refs=" + Util.URIEncode(refs)) +
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco (path == null ? "" : "&amp;path=" + Util.URIEncode(path)) +
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray (hist == null ? "" : "&amp;hist=" + Util.URIEncode(hist));
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (hasProjects) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (project!=null) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal url = url + "&amp;project=";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal for (Iterator it = project.iterator(); it.hasNext();) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal }
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal }
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal }
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal %>Sort by: <%
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal url=url+("&amp;sort=");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (sort == null || RELEVANCY.equals(sort)) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray } else if (LASTMODTIME.equals(sort)) {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet } else if (BY_PATH.equals(sort)) {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet } else {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet }
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet } %></td></tr></table>
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray</div>
cd71fb134e037849c77364b50940b1870c4684ceVladimir Kotal<div id="menu">
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco <%@ include file="menu.jspf"%>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray</div>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray<div id="results">
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray<%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray//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
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayif( hits == null || errorMsg != null) {
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco %><%=errorMsg%><%
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco } else if (hits.length == 0) {
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco File spellIndex = new File(env.getDataRootPath(), "spellIndex");
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco File[] spellIndexes=null;
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco if (RuntimeEnvironment.getInstance().hasProjects()) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (project.size() > 1) { //more projects
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray spellIndexes = new File[project.size()];
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int ii = 0;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (String proj : project) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray spellIndexes[ii++] = new File(spellIndex,proj);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco } else { // just 1 project selected
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco spellIndex = new File(spellIndex, project.get(0));
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco }
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco }
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int count=1;
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (spellIndexes!=null) {count=spellIndexes.length;}
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for (int idx = 0; idx < count; idx++) {
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (spellIndexes!=null) spellIndex = spellIndexes[idx];
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (spellIndex.exists()) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray FSDirectory spellDirectory = FSDirectory.open(spellIndex);
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco SpellChecker checker = new SpellChecker(spellDirectory);
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal Date sstart = new Date();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal boolean printHeader = true;
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal String[] toks;
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal if(q != null) {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco toks = q.split("[\t ]+");
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(toks != null){
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina for(int j=0; j<toks.length; j++) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if(toks[j].length() > 3) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina for(int i = 0;i < ret.length; i++) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if (printHeader) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina printHeader = false;
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina }
cd348e325366620fe047edcc849e3c9424828599Peter Bray %> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(refs != null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray toks = refs.split("[\t ]+");
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(toks != null){
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for(int j=0; j<toks.length; j++) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(toks[j].length() > 3) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for(int i = 0;i < ret.length; i++) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray if (printHeader) {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye printHeader = false;
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray }
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray %> <a href=search?refs=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
8f8c3f4555e5aa3160f03f2e9c55ddbd3381357bLubos Kosco }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye }
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco }
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco }
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco }
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco //TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(defs != null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray toks = defs.split("[\t ]+");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(toks != null){
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for(int j=0; j<toks.length; j++) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(toks[j].length() > 3) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for(int i = 0;i < ret.length; i++) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (printHeader) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray printHeader = false;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %> <a href=search?defs=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (printHeader) {
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco %></p><%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray spellDirectory.close();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %><p> Your search <b><%=query.toString()%></b> did not match any files.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray <br />
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray Suggestions:<br/><blockquote>- Make sure all terms are spelled correctly.<br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray - Try different keywords.<br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray - Try more general keywords.<br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray - Use 'wil*' cards if you are looking for partial match.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray </blockquote>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray </p><%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else { // We have a lots of results to show
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal StringBuilder slider = null;
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal if ( max < totalHits) {
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal if((start + max) < totalHits) {
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal thispage = max;
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray thispage = totalHits - start;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco String urlp = (q == null ? "" : "&amp;q=" + Util.URIEncode(q)) +
cd348e325366620fe047edcc849e3c9424828599Peter Bray (defs == null ? "" : "&amp;defs=" + Util.URIEncode(defs)) +
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray (refs == null ? "" : "&amp;refs=" + Util.URIEncode(refs)) +
cd348e325366620fe047edcc849e3c9424828599Peter Bray (path == null ? "" : "&amp;path=" + Util.URIEncode(path)) +
cd348e325366620fe047edcc849e3c9424828599Peter Bray (hist == null ? "" : "&amp;hist=" + Util.URIEncode(hist)) +
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray (sort == null ? "" : "&amp;sort=" + Util.URIEncode(sort));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (hasProjects) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray urlp = urlp + "&amp;project=";
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (Iterator it = project.iterator(); it.hasNext();) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray urlp = urlp + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray slider = new StringBuilder();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int labelStart =1;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int sstart = start - max* (start / max % 10 + 1) ;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if(sstart < 0) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye sstart = 0;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye labelStart = 1;
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal } else {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye labelStart = sstart/max + 1;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye int label = labelStart;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye int labelEnd = label + 11;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye String arr;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye for(int i=sstart; i<totalHits && label <= labelEnd; i+= max) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if (i <= start && start < i+ max) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye slider.append("<span class=\"sel\">" + label + "</span>");
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye } else {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if(label == labelStart && label != 1) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye arr = "&lt;&lt";
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if(label == labelEnd && i < totalHits) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray arr = "&gt;&gt;";
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal } else {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal arr = label < 10 ? " " + label : String.valueOf(label);
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal slider.append("<a class=\"more\" href=\"s?n=" + max + "&amp;start=" + i + urlp + "\">"+
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal arr + "</a>");
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal label++;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal } else {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal thispage = totalHits - start; // set the max index to max or last
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal %>&nbsp; &nbsp; Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal <%=thispage+start%></b> of <b><%=totalHits%></b>) sorted by <%=sort%> <p><%=slider != null ?
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal slider.toString(): ""%></p>
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal <table width="100%" cellpadding="3" cellspacing="0" border="0"><%
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal Context sourceContext = null;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal Summarizer summer = null;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal if (query != null) {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal try{
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal sourceContext =
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal new Context(query, queryBuilder.getQueries());
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal if(sourceContext != null)
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal summer = new Summarizer(query,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray new CompatibleAnalyser());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (Exception e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray HistoryContext historyContext = null;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray try {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray historyContext = new HistoryContext(query);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (Exception e) {
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray EftarFileReader ef = null;
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal try{
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal ef = new EftarFileReader(env.getDataRootPath() + "/index/dtags.eftar");
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal } catch (Exception e) {
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal }
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal //TODO also fix the way what and how it is passed to prettyprint, can improve performance! SearchEngine integration is really needed here.
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye Results.prettyPrintHTML(searcher,hits, start, start+thispage,
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye out,
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye sourceContext, historyContext, summer,
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye context + "/xref",
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye context + "/more",
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye env.getSourceRootPath(),
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye env.getDataRootPath(),
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ef);
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye if(ef != null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray try{
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ef.close();
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco } catch (IOException e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %></table><br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray <b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray <%=slider != null ? "<p>" + slider + "</p>" : ""%>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray <%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %><br/></div><%@include file="foot.jspf"%><%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (ireader != null)
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ireader.close();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray} else { // Entry page show the map
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray response.sendRedirect(context + "/index.jsp");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray}
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray%>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray