Skip to content

Commit

Permalink
DescIndex(column) for descending index columns, refs #260
Browse files Browse the repository at this point in the history
  • Loading branch information
simonw committed May 29, 2021
1 parent b230287 commit c374d7e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
11 changes: 11 additions & 0 deletions docs/python-api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1866,6 +1866,17 @@ By default the index will be named ``idx_{table-name}_{columns}`` - if you want
index_name="good_dogs_by_age"
)
To create an index in descending order for a column, wrap the column name in ``db.DescIndex()`` like this:
.. code-block:: python
from sqlite_utils.db import DescIndex
db["dogs"].create_index(
["is_good_dog", DescIndex("age")],
index_name="good_dogs_by_age"
)
You can create a unique index by passing ``unique=True``:
.. code-block:: python
Expand Down
13 changes: 12 additions & 1 deletion sqlite_utils/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,10 @@ class InvalidColumns(Exception):
pass


class DescIndex(str):
pass


_COUNTS_TABLE_CREATE_SQL = """
CREATE TABLE IF NOT EXISTS [{}](
[table] TEXT PRIMARY KEY,
Expand Down Expand Up @@ -1156,6 +1160,13 @@ def create_index(self, columns, index_name=None, unique=False, if_not_exists=Fal
index_name = "idx_{}_{}".format(
self.name.replace(" ", "_"), "_".join(columns)
)
columns_sql = []
for column in columns:
if isinstance(column, DescIndex):
fmt = "[{}] desc"
else:
fmt = "[{}]"
columns_sql.append(fmt.format(column))
sql = (
textwrap.dedent(
"""
Expand All @@ -1167,7 +1178,7 @@ def create_index(self, columns, index_name=None, unique=False, if_not_exists=Fal
.format(
index_name=index_name,
table_name=self.name,
columns=", ".join("[{}]".format(c) for c in columns),
columns=", ".join(columns_sql),
unique="UNIQUE " if unique else "",
if_not_exists="IF NOT EXISTS " if if_not_exists else "",
)
Expand Down
14 changes: 14 additions & 0 deletions tests/test_create.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from sqlite_utils.db import (
Index,
Database,
DescIndex,
ForeignKey,
AlterError,
NoObviousTable,
Expand Down Expand Up @@ -739,6 +740,19 @@ def test_create_index_if_not_exists(fresh_db):
dogs.create_index(["name"], if_not_exists=True)


def test_create_index_desc(fresh_db):
dogs = fresh_db["dogs"]
dogs.insert({"name": "Cleo", "twitter": "cleopaws", "age": 3, "is good dog": True})
assert [] == dogs.indexes
dogs.create_index([DescIndex("age"), "name"])
sql = fresh_db.execute(
"select sql from sqlite_master where name='idx_dogs_age_name'"
).fetchone()[0]
assert sql == (
"CREATE INDEX [idx_dogs_age_name]\n" " ON [dogs] ([age] desc, [name])"
)


@pytest.mark.parametrize(
"data_structure",
(
Expand Down

0 comments on commit c374d7e

Please sign in to comment.