view src/luan/modules/lucene/Versioning.luan @ 1422:e48290f3d9fb

better quoting
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 17 Nov 2019 16:28:51 -0700
parents 87a3738d7cc5
children
line wrap: on
line source

local Luan = require "luan:Luan.luan"
local error = Luan.error
local pairs = Luan.pairs or error()
local Number = require "luan:Number.luan"
local integer = Number.integer or error()
local long = Number.long or error()
local String = require "luan:String.luan"
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.luan"
local copy = Table.copy or error()
local Lucene = require "luan:lucene/Lucene.luan"
local Logging = require "luan:logging/Logging.luan"

local logger = Logging.logger "lucene versioning"


local Versioning = {}

function Versioning.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.run_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 Versioning.a_big_step(db)
	db.indexed_fields["id index"] = Lucene.type.string
	db.advanced_search( Lucene.quote"id index" .. ":*", function(_,doc_fn)
		local doc = doc_fn()
		for field, value in pairs(copy(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.quote"type index" .. ":*" )
end

return Versioning