view lucene/src/luan/modules/lucene/Web_search.luan @ 550:b2139b21b49c 0.10

use Io.repr() in lucene/Web_search
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 17 Jun 2015 19:50:32 -0600
parents c69b4833a3a3
children 363d07e26549
line wrap: on
line source

local Luan = require "luan:Luan"
local error = Luan.error
local pairs = Luan.pairs or error()
local ipairs = Luan.ipairs or error()
local range = Luan.range or error()
local to_string = Luan.to_string or error()
local Io = require "luan:Io"
local repr = Io.repr or error()
local Http = require "luan:http/Http"
local String = require "luan:String"
local string_to_number = String.to_number or error()
local Html = require "luan:Html"

local M = {}

local function form() %>
<html>
	<head>
		<% Html.simply_html_head() %>
		<title>Lucene Query</title>
	</head>
	<body>
		<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" autofocus />
						<div textcolor="#888">Query examples: <i>type:user</i> or <i>+type:user +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: <i>name, id</i></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>
		<% Html.simply_html_body_bottom() %>
	</body>
</html>
<% end


local function result(query,sort,headers,table) %>
<html>
	<head>
		<% Html.simply_html_head() %>
		<title>Lucene Query</title>
	</head>
	<body>
		<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><%=Html.encode(to_string(query))%></b></p>
				</div>
			</div>
			<div row>
				<div colspan=2 align="right">
					<label>Sort:</label>
				</div>
				<div colspan=10>
					<b><%=Html.encode(to_string(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
							local val = row[col]
							%><td><%= val and repr(val) or "" %></td><%
						end
						%>
					</tr>
				<% end %>
			</table>
		</div>
		<% Html.simply_html_body_bottom() %>
	</body>
</html>
<% 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 M.of(index)
	index or error "index is nil"

	return function()
		Io.stdout = Http.response.text_writer()
		local query = Http.request.parameter.query
		if query == nil then
			form()
			return
		end
		local rows = string_to_number(Http.request.parameter.rows)
		local sort = Http.request.parameter.sort
		local results = index.search(query,1,rows,sort)
		local headers = {}
		local table = {}
		for _, doc in ipairs(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

return M