altcodepro-polydb-python 2.6.0__py3-none-any.whl → 2.6.1__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: altcodepro-polydb-python
3
- Version: 2.6.0
3
+ Version: 2.6.1
4
4
  Summary: Production-ready multi-cloud database abstraction layer with connection pooling, retry logic, and thread safety
5
5
  Author: AltCodePro
6
6
  Project-URL: Homepage, https://github.com/altcodepro/polydb-python
@@ -1,4 +1,4 @@
1
- altcodepro_polydb_python-2.6.0.dist-info/licenses/LICENSE,sha256=9X8GLocsBwy-5aR5JGOt2SAMDDPs9Qv-YnqmHBHOXrw,1067
1
+ altcodepro_polydb_python-2.6.1.dist-info/licenses/LICENSE,sha256=9X8GLocsBwy-5aR5JGOt2SAMDDPs9Qv-YnqmHBHOXrw,1067
2
2
  polydb/PolyDB.py,sha256=Lp0QtG7D89Z6P6nt9fVoT8rVHAy8xlE2kFRSS70r-mk,23672
3
3
  polydb/__init__.py,sha256=XuPMkOUcluxI8TIMNZCPyI1MZg77DC-10FKANEVobME,1876
4
4
  polydb/advanced_query.py,sha256=M9sKmdF2PsLZWSc-zKpXRcwaDumbYYTsibmL_IAjKP4,6931
@@ -29,7 +29,7 @@ polydb/adapters/AzureBlobStorageAdapter.py,sha256=ZTovSC_CVduGnIoIQUUeNxDQlf-IbF
29
29
  polydb/adapters/AzureFileStorageAdapter.py,sha256=VZNprqlBXCuWUgtqClNT-NrQmRf-XFYEiRA2BLbf-Sc,7046
30
30
  polydb/adapters/AzureKeyVaultAdapter.py,sha256=EtsrxI3X75nORnO0KbvKTVXJfliHd-gt3y9Mo8Npugs,3365
31
31
  polydb/adapters/AzureQueueAdapter.py,sha256=1e2HiFvkH1BI_JKS9fgays2J41kOfH6pUPbZDe1wmWA,13658
32
- polydb/adapters/AzureTableStorageAdapter.py,sha256=7nNSL1yX3EPDkLptDcUBExOf7sNroNXK4oTwSPDgUsg,40785
32
+ polydb/adapters/AzureTableStorageAdapter.py,sha256=iQSzPqABcT-l_O7s-mVOiioMzJXRdjfZt2Dh65GD-xA,41623
33
33
  polydb/adapters/BlockchainBlobAdapter.py,sha256=85H3PxiL9rGDtK-sTsW26jOuUQ_SGipLSPu3s-juZRA,3298
34
34
  polydb/adapters/BlockchainFileAdapter.py,sha256=lZbRyC18LghZcVh5QyIRP7tCftNF_Ep1FKG0KRkvMmk,8335
35
35
  polydb/adapters/BlockchainKVAdapter.py,sha256=pvpiPshDE5Z_IRcSBvBwgAXT--86lgEyIsEUeqcmoE8,5422
@@ -71,7 +71,7 @@ polydb/observability/logging.py,sha256=FWYky-Mg1IhLpwuaKuLIsTROBZc9bI_-AO-y53nvE
71
71
  polydb/services/__init__.py,sha256=Zs3PZbHutgPdPjJatygvtYvKPZMBt1qKSqESbFRPHJs,241
72
72
  polydb/services/compliance_service.py,sha256=UMjCbQ4z13-w6pT4RLQpMi_u1zbShEpiz8kawA2WsSU,5075
73
73
  polydb/services/security_service.py,sha256=gGo_j9Ca_rgvxS7s6C5JUktugQBj1PV1DXpMnOYAGbI,4992
74
- altcodepro_polydb_python-2.6.0.dist-info/METADATA,sha256=Pvi9KDJMCNteoahMUpIH5bM2Igc-MS47jXbmVZ6Pk3I,15600
75
- altcodepro_polydb_python-2.6.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
76
- altcodepro_polydb_python-2.6.0.dist-info/top_level.txt,sha256=WgLFWJoYjUhwvyPxJFl6jYLrVFuBJDX3OABf4ocwk_E,7
77
- altcodepro_polydb_python-2.6.0.dist-info/RECORD,,
74
+ altcodepro_polydb_python-2.6.1.dist-info/METADATA,sha256=BCUzR9Bpm7q16CWx1YcTyQxzsLuFme6EMRq7m6Bd8NE,15600
75
+ altcodepro_polydb_python-2.6.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
76
+ altcodepro_polydb_python-2.6.1.dist-info/top_level.txt,sha256=WgLFWJoYjUhwvyPxJFl6jYLrVFuBJDX3OABf4ocwk_E,7
77
+ altcodepro_polydb_python-2.6.1.dist-info/RECORD,,
@@ -785,22 +785,34 @@ class AzureTableStorageAdapter(NoSQLKVAdapter):
785
785
  self._sanitize_prop_name(orig_k) if orig_k != _MODEL_FIELD else _MODEL_FIELD
786
786
  )
787
787
 
788
- ev = self._encode_value(orig_v)
789
-
790
- if ev is None:
791
- parts.append(f"{sk} eq null")
792
- elif isinstance(ev, bool):
793
- parts.append(f"{sk} eq {str(ev).lower()}")
794
- elif isinstance(ev, (int, float)):
795
- parts.append(f"{sk} eq {ev}")
796
- elif isinstance(ev, datetime):
797
- iso = ev.isoformat()
798
- if not iso.endswith("Z"):
799
- iso = iso + "Z"
800
- parts.append(f"{sk} eq datetime'{iso}'")
801
- else:
802
- sval = str(ev).replace("'", "''")
803
- parts.append(f"{sk} eq '{sval}'")
788
+ def _eq(prop: str, raw: Any) -> str:
789
+ ev = self._encode_value(raw)
790
+ if ev is None:
791
+ return f"{prop} eq null"
792
+ if isinstance(ev, bool):
793
+ return f"{prop} eq {str(ev).lower()}"
794
+ if isinstance(ev, (int, float)):
795
+ return f"{prop} eq {ev}"
796
+ if isinstance(ev, datetime):
797
+ iso = ev.isoformat()
798
+ if not iso.endswith("Z"):
799
+ iso = iso + "Z"
800
+ return f"{prop} eq datetime'{iso}'"
801
+ return f"{prop} eq '{str(ev).replace(chr(39), chr(39) * 2)}'"
802
+
803
+ if isinstance(orig_v, (list, tuple, set, frozenset)) and all(
804
+ isinstance(x, (str, int, float, bool)) for x in orig_v
805
+ ):
806
+ # A list of plain values means "equals any of them" (the SQL adapters already read it that way). Sent as
807
+ # one JSON-encoded string it matched no row at all, so every `field: [a, b]` lookup silently returned [].
808
+ if not orig_v:
809
+ return [] # IN () matches nothing
810
+ if len(orig_v) > 100:
811
+ raise NoSQLError("Azure Table filter: at most 100 values in a list")
812
+ parts.append("(" + " or ".join(_eq(sk, x) for x in orig_v) + ")")
813
+ continue
814
+
815
+ parts.append(_eq(sk, orig_v))
804
816
 
805
817
  # Empty-filter contract: if the caller passed filter keys but every
806
818
  # condition dropped out (e.g. all values None/unresolvable), the query