Skip to content

Commit

Permalink
Support --limit in dsc ls, add backend support
Browse files Browse the repository at this point in the history
- _select_simple now supports passing limit which results in a SQL LIMIT
  <N> clause.
- make sure OFFSET does not interfere with it (uses LIMIT as well)
- New -l option in dsc ls command.
  • Loading branch information
JOJ0 committed Feb 6, 2025
1 parent 6e51b26 commit d4bb515
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 7 deletions.
5 changes: 4 additions & 1 deletion discodos/cmd23/ls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
@click.argument("search_terms", metavar="SEARCH_TERMS", nargs=-1)
@click.option("--order-by", "-o", type=str, help="order by DiscoBASE field")
@click.option("--reverse", "-r", is_flag=True, help="reverse order")
@click.option("--limit", "-l", type=int, help="limit results")
@click.option(
"--all", "--extra", "-a", "-e", "sales_extra", is_flag=True,
help="""By default sales and collection items are displayed in a 'combined' view.
Expand All @@ -26,7 +27,7 @@
""",
)
@click.pass_obj
def ls_cmd(helper, search_terms, order_by, reverse, sales_extra):
def ls_cmd(helper, search_terms, order_by, reverse, sales_extra, limit):
"""Searches and lists collection items.
Supports key=value search. Available keys can be either full DiscoBASE field names
Expand Down Expand Up @@ -58,11 +59,13 @@ def update_user_interaction_helper(user):
orderby=order_by,
reverse_order=reverse,
sales_extra=sales_extra,
limit=limit,
)
else:
coll_ctrl.ls_releases(
search_key_value,
orderby=order_by,
reverse_order=reverse,
sales_extra=sales_extra,
limit=limit,
)
6 changes: 4 additions & 2 deletions discodos/ctrl/collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -1242,7 +1242,7 @@ def prepare_key_value_search(self, query):
return kv

def tui_ls_releases(
self, search_terms, orderby=None, reverse_order=False, sales_extra=False
self, search_terms, orderby=None, reverse_order=False, sales_extra=False, limit=None
):
"""search_terms is a key value dict: eg: d_artist: artistname"""

Expand All @@ -1259,6 +1259,7 @@ def tui_ls_releases(
reverse_order=reverse_order,
filter_cols=self.cli.cols_key_value_search.shortcuts_dict(),
sales_extra=sales_extra,
limit=limit,
)
except Exception as error:
self.cli.p(error)
Expand All @@ -1281,7 +1282,7 @@ def tui_ls_releases(
return

def ls_releases(
self, search_terms, orderby=None, reverse_order=False, sales_extra=False
self, search_terms, orderby=None, reverse_order=False, sales_extra=False, limit=None
):
"""search_terms is a key value dict: eg: d_artist: artistname"""

Expand All @@ -1297,6 +1298,7 @@ def ls_releases(
reverse_order=reverse_order,
filter_cols=self.cli.cols_key_value_search.shortcuts_dict(),
sales_extra=sales_extra,
limit=limit,
)
except Exception as error:
self.cli.p(error)
Expand Down
3 changes: 2 additions & 1 deletion discodos/model/collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,7 @@ def update_release_brainz(self, release_id, mbid, match_method):

def key_value_search_releases(
self, search_key_value=None, orderby=None, filter_cols=None,
custom_fields=None, reverse_order=False, sales_extra=False
custom_fields=None, reverse_order=False, sales_extra=False, limit=None,
):
# filter_cols are defined in ViewCommon and passed via the controller call.
replace_cols = filter_cols
Expand Down Expand Up @@ -882,6 +882,7 @@ def key_value_search_releases(
join=join,
union=union if sales_extra else None,
reverse_order=reverse_order,
limit=limit,
)
return rows

Expand Down
14 changes: 11 additions & 3 deletions discodos/model/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ def _select_simple(
as_dict=False,
union=None,
reverse_order=False,
limit=None
):
"""Wrapper around the _select method. Puts together SELECT as string.
Expand All @@ -118,13 +119,15 @@ def _select_simple(
as_dict (bool, optional): Return results as a dictionary.
union (list, optional): List of dicts representing UNION statements.
Each dict has keys: fields_list, table, condition, join.
limit (int, optional): limit results.
Returns:
Query results from _select.
"""
log.debug("DB: _select_simple: fetchone = %s", fetchone)
fields_str = ", ".join(fields_list)
join_clause = ""
limit_clause = ""
if join:
# Expecting join as a list of tuples: [(join_type, table, condition), ...]
for join_type, join_table, join_cond in join:
Expand All @@ -133,7 +136,12 @@ def _select_simple(
orderby_clause = f"ORDER BY {orderby}" if orderby else ""
orderby_clause += " DESC" if reverse_order else ""
select = "SELECT DISTINCT" if distinct else "SELECT"
limit = f"LIMIT -1 OFFSET {offset}" if offset else ""
if offset and limit:
limit_clause = f"LIMIT {limit} OFFSET {offset}"
elif offset:
limit_clause = f"LIMIT -1 OFFSET {offset}"
elif limit:
limit_clause = f"LIMIT {limit}"

# Build the main SELECT query
main_select = (
Expand Down Expand Up @@ -162,9 +170,9 @@ def _select_simple(

select_str = (
f"{main_select} UNION {' UNION '.join(union_queries)} "
f"{orderby_clause} {limit}"
f"{orderby_clause} {limit_clause}"
if union_queries
else f"{main_select} {orderby_clause} {limit}"
else f"{main_select} {orderby_clause} {limit_clause}"
)
return self._select(select_str, fetchone, as_dict=as_dict)

Expand Down

0 comments on commit d4bb515

Please sign in to comment.