view lucene/src/luan/modules/lucene/Web_search.luan @ 325:78a6a71afbfd

use SimplyHTML git-svn-id: https://luan-java.googlecode.com/svn/trunk@326 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 03 Mar 2015 06:00:59 +0000
parents 7f7708e8fdd4
children fb18724521d2
line wrap: on
line source

local Luan = require "luan:Luan"
local load = Luan.load
local to_number = Luan.to_number
local pairs = Luan.pairs
local ipairs = Luan.ipairs
local range = Luan.range
local Io = require "luan:Io"
local Http = require "luan:web/Http"
local String = require "luan:String"
local Html = require "luan:Html"


local function form()
	Html.simple_html_page{
		head = function() %>
			<title>Lucene Query</title>
<%		end;
		body = function() %>
			<div container>
				<h3 margin-top="1.5em">Lucene Query</h3>
				<form horizontal name="form0" method="post" margin-top="2em">
					<div row>
						<div colspan=2 align="right">
							<label>Query:</label>
						</div>
						<div colspan=10>
							<input name="query" size="80" value="Query.all_docs" autofocus />
							<div textcolor="#888">Query examples: <i>Query.term{ type = 'user' }</i> or <i>"type:user AND name:Joe"</i></div>
						</div>
					</div>
					<div row margin-top="1em">
						<div colspan=2 align="right">
							<label>Max Rows:</label>
						</div>
						<div colspan=10>
							<input name="rows" value="100" size="3" maxlength="5" /></p>
						</div>
					</div>
					<div row margin-top="1em">
						<div colspan=2 align="right">
							<label>Sort:</label>
						</div>
						<div colspan=10>
							<input name="sort" size="60" />
							<div textcolor="#888">Sort examples: Query.sort{{ field = 'id', type='int' }}</div>
						</div>
					</div>
					<div row margin-top="1em">
						<div colspan=2></div>
						<div colspan=10>
							<input type="submit" textcolor="white" bgcolor="#337ab7" large/>
						</div>
					</div>
				</form>
			</div>
<%		end;
	}
end


local function result(query,sort,headers,table)
	Html.simple_html_page{
		body = function() %>
			<div container>
				<h3 margin-top="1.5em">Lucene Query Results</h3>
				<div row>
					<div colspan=2 align="right">
						<label>Query:</label>
					</div>
					<div colspan=10>
						<b><%=query%></b></p>
					</div>
				</div>
				<div row>
					<div colspan=2 align="right">
						<label>Sort:</label>
					</div>
					<div colspan=10>
						<b><%=sort%></b></p>
					</div>
				</div>
				<table border condensed margin-top="1.5em">
					<tr>
						<th></th>
						<% for _, header in ipairs(headers) do %>
							<th><%=header%></th>
						<% end %>
					</tr>
					<% for i, row in ipairs(table) do %>
						<tr>
							<td><%=i%></td>
							<% for col in range(1, #headers) do %>
								<td><%= row[col] or "" %></td>
							<% end %>
						</tr>
					<% end %>
				</table>
			</div>
<%		end;
	}
end


local function index_of(tbl,val)
	for i, v in ipairs(tbl) do
		if v == val then
			return i
		end
	end
	local n = #tbl + 1
	tbl[n] = val
	return n
end


function of(index)

	return { service = function()
		Io.stdout = Http.response.text_writer()
		local query_string = Http.request.parameters.query
		if query_string == nil then
			form()
			return
		end
		local query = load(query_string,"<query>",{Query=index.Query},true)()
		local rows = to_number(Http.request.parameters.rows)
		local sort = load(Http.request.parameters.sort,"<sort>",{Query=index.Query},true)()
		index.Searcher( function(searcher)
			local results, length, total_hits = searcher.search(query,rows,sort)
			local headers = {}
			local table = {}
			for doc in results do
				local row = {}
				for field, value in pairs(doc) do
					row[index_of(headers,field)] = value
				end
				table[#table+1] = row
			end
			result(query,sort,headers,table)
		end )
	end }

end