view lucene/src/luan/modules/lucene/Versioning.luan @ 548:f4dfe9c64c25

shorten some String function names
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 15 Jun 2015 17:30:28 -0600
parents 0be287ab0309
children 22bfd8a2eaee
line wrap: on
line source

local Luan = require "luan:Luan"
local error = Luan.error
local pairs = Luan.pairs or error()
local Number = require "luan:Number"
local integer = Number.integer or error()
local long = Number.long or error()
local String = require "luan:String"
local matches = String.matches or error()
local sub = String.sub or error()
local string_to_number = String.to_number or error()
local Table = require "luan:Table"
local clone = Table.clone or error()
local Lucene = require "luan:lucene/Lucene"
require "luan:logging/init"
local Logging = require "luan:logging/Logging"

local logger = Logging.logger "lucene versioning"


local M = {}

function M.update(db,steps,version)
	local doc = db.get_document"type:version" or { type="version", version=integer(0) }
	while doc.version < version do
		doc.version = integer(doc.version + 1)
		logger.error("step "..doc.version)
		db.update_in_transaction( function()
			local step = steps[doc.version]
			step and step(db)
			db.save(doc)
		end )
	end
end


-- hack to deal with latest changes
function M.a_big_step(db)
	db.indexed_fields["id index"] = Lucene.type.string
	db.advanced_search( Lucene.literal"id index" .. ":*", function(_,doc_fn)
		local doc = doc_fn()
		for field, value in pairs(clone(doc)) do
			if matches(field,".* index") then
				local new_field = sub(field,1,-7)
				db.indexed_fields[new_field] or error("field '"..new_field.."' not indexed")
				doc[new_field] = value
				doc[field] = nil
			end
		end
		doc.id = long(string_to_number(doc.id))
		db.save(doc)
	end )
	db.indexed_fields["type index"] = Lucene.type.string
	db.delete( Lucene.literal"type index" .. ":*" )
end

return M