Module:QueryBuilder

From Sekaipedia

local cargo = mw.ext.cargo

local QueryBuilder = {}
QueryBuilder.__index = QueryBuilder

function QueryBuilder.new()
	local obj = setmetatable({
		tables = nil,
		fields = nil,
		wheres = {},
		joinOn = nil,
		groupBy = nil,
		orderBy = nil,
		limit = nil,
		offset = nil
	}, QueryBuilder)
	
	return obj
end

function QueryBuilder:setTables(tables)
	self.tables = tables
	
	return self
end

function QueryBuilder:setFields(fields)
	self.fields = fields
	
	return self
end

function QueryBuilder:addWhere(field, compareOp, value)
	if value and value ~= '' then
		table.insert(
			self.wheres,
			string.format(
				"(%s %s '%s')", 
				field,
				compareOp,
				value
			)
		)
	end
	
	return self
end

function QueryBuilder:addWhereList(field, compareOp, value, delim, logicalOp)
	if value and value ~= '' then
		local splitVals = mw.text.split(value, delim)
		for i=1,#splitVals do
			splitVals[i] = mw.text.trim(splitVals[i])
		end

		local splitWheres = {}
		
		for _,split in ipairs(splitVals) do
			table.insert(
				splitWheres,
				string.format(
					"%s %s '%s'",
					field,
					compareOp,
					split
				)
			)
		end
		
		table.insert(
			self.wheres,
			string.format(
				'(%s)',
				table.concat(splitWheres, ' ' .. logicalOp .. ' ')
			)
		)
	end
	
	return self
end

function QueryBuilder:setJoinOn(joinOn)
	if joinOn and joinOn ~= '' then
		self.joinOn = joinOn
	end
	
	return self
end

function QueryBuilder:setGroupBy(groupBy)
	if groupBy and groupBy ~= '' then
		self.groupBy = groupBy
	end
	
	return self
end

function QueryBuilder:setOrderBy(orderBy)
	if orderBy and orderBy ~= '' then
		self.orderBy = orderBy
	end
	
	return self
end

function QueryBuilder:setLimit(limit)
	if limit and tonumber(limit) then
		self.limit = limit
	end
	
	return self
end

function QueryBuilder:setOffset(offset)
	if offset and tonumber(offset) then
		self.offset = offset
	end
	
	return self
end

function QueryBuilder:query()
	assert(self.tables)
	assert(self.fields)
	assert(#mw.text.split(self.fields, ',') > 0)
	
	return cargo.query(
		self.tables,
		self.fields,
		{
			where = table.concat(self.wheres, ' AND '),
    		join = self.joinOn,
			groupBy = self.groupBy,
			having = self.having,
			orderBy = self.orderBy,
			limit = self.limit,
			offset = self.offset,
		}
	)

end

return QueryBuilder
Cookies help us deliver our services. By using our services, you agree to our use of cookies.