sqlalchemy-iris 0.15.2b1__tar.gz → 0.15.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. {sqlalchemy_iris-0.15.2b1/sqlalchemy_iris.egg-info → sqlalchemy_iris-0.15.3}/PKG-INFO +1 -1
  2. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_DBAPI.py +2 -1
  3. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/setup.cfg +1 -1
  4. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/alembic.py +7 -0
  5. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/base.py +11 -0
  6. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3/sqlalchemy_iris.egg-info}/PKG-INFO +1 -1
  7. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/tests/test_suite.py +198 -153
  8. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/LICENSE +0 -0
  9. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/README.md +0 -0
  10. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_BufferReader.py +0 -0
  11. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_BufferWriter.py +0 -0
  12. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_ConnectionInformation.py +0 -0
  13. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_ConnectionParameters.py +0 -0
  14. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_Constant.py +0 -0
  15. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_DBList.py +0 -0
  16. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_Device.py +0 -0
  17. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_GatewayContext.py +0 -0
  18. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_GatewayException.py +0 -0
  19. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_GatewayUtility.py +0 -0
  20. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRIS.py +0 -0
  21. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISConnection.py +0 -0
  22. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISEmbedded.py +0 -0
  23. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISGlobalNode.py +0 -0
  24. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISGlobalNodeView.py +0 -0
  25. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISIterator.py +0 -0
  26. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISList.py +0 -0
  27. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISNative.py +0 -0
  28. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISOREF.py +0 -0
  29. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISObject.py +0 -0
  30. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_IRISReference.py +0 -0
  31. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_InStream.py +0 -0
  32. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_LegacyIterator.py +0 -0
  33. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_ListItem.py +0 -0
  34. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_ListReader.py +0 -0
  35. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_ListWriter.py +0 -0
  36. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_LogFileStream.py +0 -0
  37. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_MessageHeader.py +0 -0
  38. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_OutStream.py +0 -0
  39. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_PrintStream.py +0 -0
  40. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_PythonGateway.py +0 -0
  41. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/_SharedMemorySocket.py +0 -0
  42. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/__init__.py +0 -0
  43. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/__main__.py +0 -0
  44. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_Column.py +0 -0
  45. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_Descriptor.py +0 -0
  46. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_IRISStream.py +0 -0
  47. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_Message.py +0 -0
  48. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_Parameter.py +0 -0
  49. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_ParameterCollection.py +0 -0
  50. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_ResultSetRow.py +0 -0
  51. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/_SQLType.py +0 -0
  52. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/__init__.py +0 -0
  53. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/preparser/_PreParser.py +0 -0
  54. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/preparser/_Scanner.py +0 -0
  55. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/preparser/_Token.py +0 -0
  56. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/preparser/_TokenList.py +0 -0
  57. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/dbapi/preparser/__init__.py +0 -0
  58. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_BusinessHost.py +0 -0
  59. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_BusinessOperation.py +0 -0
  60. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_BusinessProcess.py +0 -0
  61. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_BusinessService.py +0 -0
  62. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_Common.py +0 -0
  63. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_Director.py +0 -0
  64. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_IRISBusinessOperation.py +0 -0
  65. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_IRISBusinessService.py +0 -0
  66. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_IRISInboundAdapter.py +0 -0
  67. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_IRISOutboundAdapter.py +0 -0
  68. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_InboundAdapter.py +0 -0
  69. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_Message.py +0 -0
  70. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/_OutboundAdapter.py +0 -0
  71. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/intersystems_iris/pex/__init__.py +0 -0
  72. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/iris/__init__.py +0 -0
  73. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/iris/__init__.pyi +0 -0
  74. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/iris/iris_ipm.py +0 -0
  75. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/iris/iris_ipm.pyi +0 -0
  76. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/irisnative/_IRISNative.py +0 -0
  77. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/irisnative/__init__.py +0 -0
  78. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/setup.py +0 -0
  79. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/__init__.py +0 -0
  80. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/embedded.py +0 -0
  81. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/information_schema.py +0 -0
  82. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/iris.py +0 -0
  83. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/irisasync.py +0 -0
  84. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/provision.py +0 -0
  85. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/requirements.py +0 -0
  86. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris/types.py +0 -0
  87. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris.egg-info/SOURCES.txt +0 -0
  88. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris.egg-info/dependency_links.txt +0 -0
  89. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris.egg-info/entry_points.txt +0 -0
  90. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris.egg-info/requires.txt +0 -0
  91. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/sqlalchemy_iris.egg-info/top_level.txt +0 -0
  92. {sqlalchemy_iris-0.15.2b1 → sqlalchemy_iris-0.15.3}/tests/test_alembic.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlalchemy-iris
3
- Version: 0.15.2b1
3
+ Version: 0.15.3
4
4
  Summary: InterSystems IRIS for SQLAlchemy
5
5
  Home-page: https://github.com/caretdev/sqlalchemy-iris
6
6
  Maintainer: CaretDev
@@ -1,3 +1,4 @@
1
+ from typing import Union
1
2
  import struct
2
3
  import copy
3
4
  import enum
@@ -43,7 +44,7 @@ def embedded_connect(*args, hostname=None, port=None, namespace=None, username=N
43
44
  return connection
44
45
 
45
46
 
46
- def connect(*args, embedded=False, hostname=None, port=None, namespace=None, username=None, password=None, **kw) -> _IRISConnection | _IRISEmbedded:
47
+ def connect(*args, embedded=False, hostname=None, port=None, namespace=None, username=None, password=None, **kw) -> Union[_IRISConnection, _IRISEmbedded]:
47
48
  try:
48
49
  if not embedded:
49
50
  return native_connect(
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = sqlalchemy-iris
3
- version = 0.15.2b1
3
+ version = 0.15.3
4
4
  description = InterSystems IRIS for SQLAlchemy
5
5
  long_description = file: README.md
6
6
  url = https://github.com/caretdev/sqlalchemy-iris
@@ -7,6 +7,7 @@ from typing import Any
7
7
  from sqlalchemy.ext.compiler import compiles
8
8
  from sqlalchemy.sql.base import Executable
9
9
  from sqlalchemy.sql.elements import ClauseElement
10
+ from sqlalchemy.sql.schema import CheckConstraint
10
11
  from sqlalchemy.sql.type_api import TypeEngine
11
12
  from sqlalchemy.sql import table
12
13
  from sqlalchemy import types
@@ -134,6 +135,12 @@ class IRISImpl(DefaultImpl):
134
135
  **kw,
135
136
  )
136
137
 
138
+ def add_constraint(self, const: Any) -> None:
139
+ if isinstance(const, CheckConstraint):
140
+ # just ignore it
141
+ return
142
+ super().add_constraint(const)
143
+
137
144
 
138
145
  class _ExecDropForeignKey(Executable, ClauseElement):
139
146
  inherit_cache = False
@@ -591,6 +591,12 @@ class IRISCompiler(sql.compiler.SQLCompiler):
591
591
  self.process(binary.right, **kw),
592
592
  )
593
593
 
594
+ def visit_concat_func(
595
+ self, func, **kw
596
+ ):
597
+ args = [self.process(clause, **kw) for clause in func.clauses.clauses]
598
+ return ' || '.join(args)
599
+
594
600
  def visit_mod_binary(self, binary, operator, **kw):
595
601
  return (
596
602
  self.process(binary.left, **kw) + " # " + self.process(binary.right, **kw)
@@ -955,6 +961,11 @@ There are no access to %Dictionary, may be required for some advanced features,
955
961
  return row[0]
956
962
  return None
957
963
 
964
+ def get_isolation_level_values(self, dbapi_connection):
965
+ levels = set(self._isolation_lookup)
966
+ levels.add("AUTOCOMMIT")
967
+ return levels
968
+
958
969
  def get_isolation_level(self, connection):
959
970
  try:
960
971
  level = int(self._get_option(connection, "IsolationMode"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlalchemy-iris
3
- Version: 0.15.2b1
3
+ Version: 0.15.3
4
4
  Summary: InterSystems IRIS for SQLAlchemy
5
5
  Home-page: https://github.com/caretdev/sqlalchemy-iris
6
6
  Maintainer: CaretDev
@@ -9,10 +9,11 @@ from sqlalchemy.testing.assertions import eq_
9
9
  from sqlalchemy.testing import config
10
10
  from sqlalchemy.orm import Session
11
11
  from sqlalchemy import testing
12
- from sqlalchemy import Table, Column, select
12
+ from sqlalchemy import Table, Column, select, func
13
13
  from sqlalchemy.types import Integer
14
14
  from sqlalchemy.types import String
15
15
  from sqlalchemy.types import VARBINARY
16
+ from sqlalchemy.types import TEXT
16
17
  from sqlalchemy.types import BINARY
17
18
  from sqlalchemy_iris import TINYINT
18
19
  from sqlalchemy_iris import INTEGER
@@ -25,6 +26,30 @@ from sqlalchemy.testing.suite import * # noqa
25
26
 
26
27
  from sqlalchemy import __version__ as sqlalchemy_version
27
28
 
29
+ if sqlalchemy_version.startswith("2."):
30
+ from sqlalchemy.testing.suite import (
31
+ BizarroCharacterFKResolutionTest as _BizarroCharacterFKResolutionTest,
32
+ )
33
+
34
+ class BizarroCharacterFKResolutionTest(_BizarroCharacterFKResolutionTest):
35
+ @testing.combinations(
36
+ ("id",), ("(3)",), ("col%p",), ("[brack]",), argnames="columnname"
37
+ )
38
+ @testing.variation("use_composite", [True, False])
39
+ @testing.combinations(
40
+ ("plain",),
41
+ # ("(2)",), not in IRIS
42
+ ("per % cent",),
43
+ ("[brackets]",),
44
+ argnames="tablename",
45
+ )
46
+ def test_fk_ref(
47
+ self, connection, metadata, use_composite, tablename, columnname
48
+ ):
49
+ super().test_fk_ref(
50
+ connection, metadata, use_composite, tablename, columnname
51
+ )
52
+
28
53
 
29
54
  class CompoundSelectTest(_CompoundSelectTest):
30
55
  @pytest.mark.skip()
@@ -269,175 +294,195 @@ class IRISEnumTest(fixtures.TablesTest):
269
294
  )
270
295
 
271
296
 
272
- if sqlalchemy_version.startswith("2."):
273
- from sqlalchemy.testing.suite import (
274
- BizarroCharacterFKResolutionTest as _BizarroCharacterFKResolutionTest,
275
- )
297
+ class IRISListBuildTest(fixtures.TablesTest):
298
+ __backend__ = True
276
299
 
277
- class BizarroCharacterFKResolutionTest(_BizarroCharacterFKResolutionTest):
278
- @testing.combinations(
279
- ("id",), ("(3)",), ("col%p",), ("[brack]",), argnames="columnname"
280
- )
281
- @testing.variation("use_composite", [True, False])
282
- @testing.combinations(
283
- ("plain",),
284
- # ("(2)",), not in IRIS
285
- ("per % cent",),
286
- ("[brackets]",),
287
- argnames="tablename",
300
+ @classmethod
301
+ def define_tables(cls, metadata):
302
+ Table(
303
+ "data",
304
+ metadata,
305
+ Column("val", IRISListBuild(10, float)),
288
306
  )
289
- def test_fk_ref(
290
- self, connection, metadata, use_composite, tablename, columnname
291
- ):
292
- super().test_fk_ref(
293
- connection, metadata, use_composite, tablename, columnname
307
+
308
+ @classmethod
309
+ def fixtures(cls):
310
+ return dict(
311
+ data=(
312
+ ("val",),
313
+ ([1.0] * 50,),
314
+ ([1.23] * 50,),
315
+ ([i for i in range(0, 50)],),
316
+ (None,),
294
317
  )
318
+ )
295
319
 
296
- class IRISListBuildTest(fixtures.TablesTest):
297
- __backend__ = True
320
+ def _assert_result(self, select, result):
321
+ with config.db.connect() as conn:
322
+ eq_(conn.execute(select).fetchall(), result)
298
323
 
299
- @classmethod
300
- def define_tables(cls, metadata):
301
- Table(
302
- "data",
303
- metadata,
304
- Column("val", IRISListBuild(10, float)),
305
- )
324
+ def test_listbuild(self):
325
+ self._assert_result(
326
+ select(self.tables.data),
327
+ [
328
+ ([1.0] * 50,),
329
+ ([1.23] * 50,),
330
+ ([i for i in range(0, 50)],),
331
+ (None,),
332
+ ],
333
+ )
334
+ self._assert_result(
335
+ select(self.tables.data).where(self.tables.data.c.val == [1.0] * 50),
336
+ [
337
+ ([1.0] * 50,),
338
+ ],
339
+ )
306
340
 
307
- @classmethod
308
- def fixtures(cls):
309
- return dict(
310
- data=(
311
- ("val",),
312
- ([1.0] * 50,),
313
- ([1.23] * 50,),
314
- ([i for i in range(0, 50)],),
315
- (None,),
316
- )
317
- )
341
+ self._assert_result(
342
+ select(
343
+ self.tables.data,
344
+ self.tables.data.c.val.func("$listsame", [1.0] * 50).label("same"),
345
+ ).limit(1),
346
+ [
347
+ ([1.0] * 50, 1),
348
+ ],
349
+ )
318
350
 
319
- def _assert_result(self, select, result):
320
- with config.db.connect() as conn:
321
- eq_(conn.execute(select).fetchall(), result)
322
351
 
323
- def test_listbuild(self):
324
- self._assert_result(
325
- select(self.tables.data),
326
- [
327
- ([1.0] * 50,),
328
- ([1.23] * 50,),
329
- ([i for i in range(0, 50)],),
330
- (None,),
331
- ],
332
- )
333
- self._assert_result(
334
- select(self.tables.data).where(self.tables.data.c.val == [1.0] * 50),
335
- [
336
- ([1.0] * 50,),
337
- ],
338
- )
352
+ class IRISVectorTest(fixtures.TablesTest):
353
+ __backend__ = True
339
354
 
340
- self._assert_result(
341
- select(
342
- self.tables.data,
343
- self.tables.data.c.val.func("$listsame", [1.0] * 50).label("same"),
344
- ).limit(1),
345
- [
346
- ([1.0] * 50, 1),
347
- ],
355
+ __requires__ = ("iris_vector",)
356
+
357
+ @classmethod
358
+ def define_tables(cls, metadata):
359
+ Table(
360
+ "data",
361
+ metadata,
362
+ Column("id", INTEGER),
363
+ Column("emb", IRISVector(3, float)),
364
+ )
365
+
366
+ @classmethod
367
+ def fixtures(cls):
368
+ return dict(
369
+ data=(
370
+ (
371
+ "id",
372
+ "emb",
373
+ ),
374
+ (
375
+ 1,
376
+ [1, 1, 1],
377
+ ),
378
+ (
379
+ 2,
380
+ [2, 2, 2],
381
+ ),
382
+ (
383
+ 3,
384
+ [1, 1, 2],
385
+ ),
348
386
  )
387
+ )
349
388
 
350
- class IRISVectorTest(fixtures.TablesTest):
351
- __backend__ = True
389
+ def _assert_result(self, select, result):
390
+ with config.db.connect() as conn:
391
+ eq_(conn.execute(select).fetchall(), result)
352
392
 
353
- __requires__ = ("iris_vector",)
393
+ def test_vector(self):
394
+ self._assert_result(
395
+ select(self.tables.data.c.emb),
396
+ [
397
+ ([1, 1, 1],),
398
+ ([2, 2, 2],),
399
+ ([1, 1, 2],),
400
+ ],
401
+ )
402
+ self._assert_result(
403
+ select(self.tables.data.c.id).where(self.tables.data.c.emb == [2, 2, 2]),
404
+ [
405
+ (2,),
406
+ ],
407
+ )
354
408
 
355
- @classmethod
356
- def define_tables(cls, metadata):
357
- Table(
358
- "data",
359
- metadata,
360
- Column("id", INTEGER),
361
- Column("emb", IRISVector(3, float)),
362
- )
409
+ def test_cosine(self):
410
+ self._assert_result(
411
+ select(
412
+ self.tables.data.c.id,
413
+ ).order_by(self.tables.data.c.emb.cosine([1, 1, 1])),
414
+ [
415
+ (1,),
416
+ (2,),
417
+ (3,),
418
+ ],
419
+ )
363
420
 
364
- @classmethod
365
- def fixtures(cls):
366
- return dict(
367
- data=(
368
- (
369
- "id",
370
- "emb",
371
- ),
372
- (
373
- 1,
374
- [1, 1, 1],
375
- ),
376
- (
377
- 2,
378
- [2, 2, 2],
379
- ),
380
- (
381
- 3,
382
- [1, 1, 2],
383
- ),
384
- )
385
- )
421
+ def test_cosine_distance(self):
422
+ self._assert_result(
423
+ select(
424
+ self.tables.data.c.id,
425
+ ).order_by(1 - self.tables.data.c.emb.cosine_distance([1, 1, 1])),
426
+ [
427
+ (1,),
428
+ (2,),
429
+ (3,),
430
+ ],
431
+ )
386
432
 
387
- def _assert_result(self, select, result):
388
- with config.db.connect() as conn:
389
- eq_(conn.execute(select).fetchall(), result)
433
+ def test_max_inner_product(self):
434
+ self._assert_result(
435
+ select(
436
+ self.tables.data.c.id,
437
+ ).order_by(self.tables.data.c.emb.max_inner_product([1, 1, 1])),
438
+ [
439
+ (1,),
440
+ (3,),
441
+ (2,),
442
+ ],
443
+ )
390
444
 
391
- def test_vector(self):
392
- self._assert_result(
393
- select(self.tables.data.c.emb),
394
- [
395
- ([1, 1, 1],),
396
- ([2, 2, 2],),
397
- ([1, 1, 2],),
398
- ],
399
- )
400
- self._assert_result(
401
- select(self.tables.data.c.id).where(
402
- self.tables.data.c.emb == [2, 2, 2]
403
- ),
404
- [
405
- (2,),
406
- ],
407
- )
408
445
 
409
- def test_cosine(self):
410
- self._assert_result(
411
- select(
412
- self.tables.data.c.id,
413
- ).order_by(self.tables.data.c.emb.cosine([1, 1, 1])),
414
- [
415
- (1,),
416
- (2,),
417
- (3,),
418
- ],
419
- )
446
+ class ConcatTest(fixtures.TablesTest):
447
+ __backend__ = True
420
448
 
421
- def test_cosine_distance(self):
422
- self._assert_result(
423
- select(
424
- self.tables.data.c.id,
425
- ).order_by(1 - self.tables.data.c.emb.cosine_distance([1, 1, 1])),
426
- [
427
- (1,),
428
- (2,),
429
- (3,),
430
- ],
431
- )
449
+ @classmethod
450
+ def define_tables(cls, metadata):
451
+ Table(
452
+ "data",
453
+ metadata,
454
+ Column("sometext", TEXT),
455
+ Column("testdata", TEXT),
456
+ )
432
457
 
433
- def test_max_inner_product(self):
434
- self._assert_result(
435
- select(
436
- self.tables.data.c.id,
437
- ).order_by(self.tables.data.c.emb.max_inner_product([1, 1, 1])),
438
- [
439
- (1,),
440
- (3,),
441
- (2,),
442
- ],
458
+ @classmethod
459
+ def fixtures(cls):
460
+ return dict(
461
+ data=(
462
+ (
463
+ "sometext",
464
+ "testdata",
465
+ ),
466
+ (
467
+ "sometestdata",
468
+ "test",
469
+ ),
443
470
  )
471
+ )
472
+
473
+ def _assert_result(self, select, result):
474
+ with config.db.connect() as conn:
475
+ eq_(conn.execute(select).fetchall(), result)
476
+
477
+ def test_concat_func(self):
478
+ self._assert_result(
479
+ select(
480
+ self.tables.data.c.sometext,
481
+ ).filter(
482
+ self.tables.data.c.sometext
483
+ == func.concat("some", self.tables.data.c.testdata, "data")
484
+ ),
485
+ [
486
+ ("sometestdata",),
487
+ ],
488
+ )