Skip to content

Commit 9bcdf77

Browse files
committed
feat(sqlite): implement ops.Arbitrary
1 parent c816f00 commit 9bcdf77

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

ibis/backends/sqlite/registry.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,15 @@ def _literal(t, op):
199199
return base_literal(t, op)
200200

201201

202+
def _arbitrary(t, op):
203+
if (how := op.how) == "heavy":
204+
raise com.OperationNotDefinedError(
205+
"how='heavy' not implemented for the SQLite backend"
206+
)
207+
208+
return reduction(getattr(sa.func, f"_ibis_sqlite_arbitrary_{how}"))(t, op)
209+
210+
202211
operation_registry.update(
203212
{
204213
# TODO(kszucs): don't dispatch on op.arg since that should be always an
@@ -322,5 +331,6 @@ def _literal(t, op):
322331
ops.RandomScalar: fixed_arity(
323332
lambda: 0.5 + sa.func.random() / sa.cast(-1 << 64, sa.REAL), 0
324333
),
334+
ops.Arbitrary: _arbitrary,
325335
}
326336
)

ibis/backends/sqlite/udf.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import abc
34
import functools
45
import inspect
56
import math
@@ -350,6 +351,32 @@ def __init__(self):
350351
super().__init__(operator.xor)
351352

352353

354+
class _ibis_sqlite_arbitrary(abc.ABC):
355+
def __init__(self) -> None:
356+
self.value = None
357+
358+
@abc.abstractmethod
359+
def step(self, value):
360+
...
361+
362+
def finalize(self) -> int | None:
363+
return self.value
364+
365+
366+
@udaf
367+
class _ibis_sqlite_arbitrary_first(_ibis_sqlite_arbitrary):
368+
def step(self, value):
369+
if self.value is None:
370+
self.value = value
371+
372+
373+
@udaf
374+
class _ibis_sqlite_arbitrary_last(_ibis_sqlite_arbitrary):
375+
def step(self, value):
376+
if value is not None:
377+
self.value = value
378+
379+
353380
def _number_of_arguments(callable):
354381
signature = inspect.signature(callable)
355382
parameters = signature.parameters.values()

ibis/backends/tests/test_aggregation.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,6 @@ def mean_and_std(v):
554554
[
555555
'impala',
556556
'mysql',
557-
'sqlite',
558557
'polars',
559558
'datafusion',
560559
"mssql",
@@ -571,7 +570,6 @@ def mean_and_std(v):
571570
[
572571
'impala',
573572
'mysql',
574-
'sqlite',
575573
'polars',
576574
'datafusion',
577575
"mssql",
@@ -589,7 +587,6 @@ def mean_and_std(v):
589587
[
590588
'impala',
591589
'mysql',
592-
'sqlite',
593590
'polars',
594591
'datafusion',
595592
"mssql",

0 commit comments

Comments
 (0)