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)
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.cargo_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,
group = self.groupBy,
having = self.having,
orderBy = self.orderBy,
limit = self.limit,
offset = self.offset,
}
)
end
return QueryBuilder