def compile_zdb_query(element, compiler, **kw):
query = []
tables = set()
format_args = []
limit = ""
for i, c in enumerate(element.clauses):
add_to_query = True
if isinstance(c, BinaryExpression):
tables.add(c.left.table.name)
elif isinstance(c, BindParameter):
if isinstance(c.value, str):
pass
elif isinstance(c.value, DeclarativeMeta):
if i > 0:
raise ValueError("Table can be specified only as first param")
tables.add(c.value.__tablename__)
add_to_query = False
elif isinstance(c, BooleanClauseList):
pass
elif isinstance(c, Column):
pass
else:
raise ValueError("Unsupported filter")
if add_to_query:
query.append(compile_clause(c, compiler, tables, format_args))
if not tables:
raise ValueError("No filters passed")
elif len(tables) > 1:
raise ValueError("Different tables passed")
else:
table = tables.pop()
if hasattr(element, "_zdb_order_by") and isinstance(element._zdb_order_by, (UnaryExpression, ZdbScore)):
limit = compile_limit(order_by=element._zdb_order_by,
offset=element._zdb_offset,
limit=element._zdb_limit)
sql = "zdb(\'%s\', ctid) ==> " % table
if format_args and isinstance(format_args, list):
sql += "\'%sformat(\'%s\', %s)\'" % (
limit,
" and ".join(query),
", ".join(format_args)
)
else:
sql += "\'%s%s\'" % (
limit,
" and ".join(query))
return sql
评论列表
文章目录