sqlspec 0.16.0__cp311-cp311-win_amd64.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.

Potentially problematic release.


This version of sqlspec might be problematic. Click here for more details.

Files changed (148) hide show
  1. 51ff5a9eadfdefd49f98__mypyc.cp311-win_amd64.pyd +0 -0
  2. sqlspec/__init__.py +92 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +77 -0
  6. sqlspec/_sql.py +1347 -0
  7. sqlspec/_typing.py +680 -0
  8. sqlspec/adapters/__init__.py +0 -0
  9. sqlspec/adapters/adbc/__init__.py +5 -0
  10. sqlspec/adapters/adbc/_types.py +12 -0
  11. sqlspec/adapters/adbc/config.py +361 -0
  12. sqlspec/adapters/adbc/driver.py +512 -0
  13. sqlspec/adapters/aiosqlite/__init__.py +19 -0
  14. sqlspec/adapters/aiosqlite/_types.py +13 -0
  15. sqlspec/adapters/aiosqlite/config.py +253 -0
  16. sqlspec/adapters/aiosqlite/driver.py +248 -0
  17. sqlspec/adapters/asyncmy/__init__.py +19 -0
  18. sqlspec/adapters/asyncmy/_types.py +12 -0
  19. sqlspec/adapters/asyncmy/config.py +180 -0
  20. sqlspec/adapters/asyncmy/driver.py +274 -0
  21. sqlspec/adapters/asyncpg/__init__.py +21 -0
  22. sqlspec/adapters/asyncpg/_types.py +17 -0
  23. sqlspec/adapters/asyncpg/config.py +229 -0
  24. sqlspec/adapters/asyncpg/driver.py +344 -0
  25. sqlspec/adapters/bigquery/__init__.py +18 -0
  26. sqlspec/adapters/bigquery/_types.py +12 -0
  27. sqlspec/adapters/bigquery/config.py +298 -0
  28. sqlspec/adapters/bigquery/driver.py +558 -0
  29. sqlspec/adapters/duckdb/__init__.py +22 -0
  30. sqlspec/adapters/duckdb/_types.py +12 -0
  31. sqlspec/adapters/duckdb/config.py +504 -0
  32. sqlspec/adapters/duckdb/driver.py +368 -0
  33. sqlspec/adapters/oracledb/__init__.py +32 -0
  34. sqlspec/adapters/oracledb/_types.py +14 -0
  35. sqlspec/adapters/oracledb/config.py +317 -0
  36. sqlspec/adapters/oracledb/driver.py +538 -0
  37. sqlspec/adapters/psqlpy/__init__.py +16 -0
  38. sqlspec/adapters/psqlpy/_types.py +11 -0
  39. sqlspec/adapters/psqlpy/config.py +214 -0
  40. sqlspec/adapters/psqlpy/driver.py +530 -0
  41. sqlspec/adapters/psycopg/__init__.py +32 -0
  42. sqlspec/adapters/psycopg/_types.py +17 -0
  43. sqlspec/adapters/psycopg/config.py +426 -0
  44. sqlspec/adapters/psycopg/driver.py +796 -0
  45. sqlspec/adapters/sqlite/__init__.py +15 -0
  46. sqlspec/adapters/sqlite/_types.py +11 -0
  47. sqlspec/adapters/sqlite/config.py +240 -0
  48. sqlspec/adapters/sqlite/driver.py +294 -0
  49. sqlspec/base.py +571 -0
  50. sqlspec/builder/__init__.py +62 -0
  51. sqlspec/builder/_base.py +440 -0
  52. sqlspec/builder/_column.py +324 -0
  53. sqlspec/builder/_ddl.py +1383 -0
  54. sqlspec/builder/_ddl_utils.py +104 -0
  55. sqlspec/builder/_delete.py +77 -0
  56. sqlspec/builder/_insert.py +241 -0
  57. sqlspec/builder/_merge.py +56 -0
  58. sqlspec/builder/_parsing_utils.py +140 -0
  59. sqlspec/builder/_select.py +174 -0
  60. sqlspec/builder/_update.py +186 -0
  61. sqlspec/builder/mixins/__init__.py +55 -0
  62. sqlspec/builder/mixins/_cte_and_set_ops.py +195 -0
  63. sqlspec/builder/mixins/_delete_operations.py +36 -0
  64. sqlspec/builder/mixins/_insert_operations.py +152 -0
  65. sqlspec/builder/mixins/_join_operations.py +115 -0
  66. sqlspec/builder/mixins/_merge_operations.py +416 -0
  67. sqlspec/builder/mixins/_order_limit_operations.py +123 -0
  68. sqlspec/builder/mixins/_pivot_operations.py +144 -0
  69. sqlspec/builder/mixins/_select_operations.py +599 -0
  70. sqlspec/builder/mixins/_update_operations.py +164 -0
  71. sqlspec/builder/mixins/_where_clause.py +609 -0
  72. sqlspec/cli.py +247 -0
  73. sqlspec/config.py +395 -0
  74. sqlspec/core/__init__.py +63 -0
  75. sqlspec/core/cache.cp311-win_amd64.pyd +0 -0
  76. sqlspec/core/cache.py +873 -0
  77. sqlspec/core/compiler.cp311-win_amd64.pyd +0 -0
  78. sqlspec/core/compiler.py +396 -0
  79. sqlspec/core/filters.cp311-win_amd64.pyd +0 -0
  80. sqlspec/core/filters.py +830 -0
  81. sqlspec/core/hashing.cp311-win_amd64.pyd +0 -0
  82. sqlspec/core/hashing.py +310 -0
  83. sqlspec/core/parameters.cp311-win_amd64.pyd +0 -0
  84. sqlspec/core/parameters.py +1209 -0
  85. sqlspec/core/result.cp311-win_amd64.pyd +0 -0
  86. sqlspec/core/result.py +664 -0
  87. sqlspec/core/splitter.cp311-win_amd64.pyd +0 -0
  88. sqlspec/core/splitter.py +819 -0
  89. sqlspec/core/statement.cp311-win_amd64.pyd +0 -0
  90. sqlspec/core/statement.py +666 -0
  91. sqlspec/driver/__init__.py +19 -0
  92. sqlspec/driver/_async.py +472 -0
  93. sqlspec/driver/_common.py +612 -0
  94. sqlspec/driver/_sync.py +473 -0
  95. sqlspec/driver/mixins/__init__.py +6 -0
  96. sqlspec/driver/mixins/_result_tools.py +164 -0
  97. sqlspec/driver/mixins/_sql_translator.py +36 -0
  98. sqlspec/exceptions.py +193 -0
  99. sqlspec/extensions/__init__.py +0 -0
  100. sqlspec/extensions/aiosql/__init__.py +10 -0
  101. sqlspec/extensions/aiosql/adapter.py +461 -0
  102. sqlspec/extensions/litestar/__init__.py +6 -0
  103. sqlspec/extensions/litestar/_utils.py +52 -0
  104. sqlspec/extensions/litestar/cli.py +48 -0
  105. sqlspec/extensions/litestar/config.py +92 -0
  106. sqlspec/extensions/litestar/handlers.py +260 -0
  107. sqlspec/extensions/litestar/plugin.py +145 -0
  108. sqlspec/extensions/litestar/providers.py +454 -0
  109. sqlspec/loader.cp311-win_amd64.pyd +0 -0
  110. sqlspec/loader.py +760 -0
  111. sqlspec/migrations/__init__.py +35 -0
  112. sqlspec/migrations/base.py +414 -0
  113. sqlspec/migrations/commands.py +443 -0
  114. sqlspec/migrations/loaders.py +402 -0
  115. sqlspec/migrations/runner.py +213 -0
  116. sqlspec/migrations/tracker.py +140 -0
  117. sqlspec/migrations/utils.py +129 -0
  118. sqlspec/protocols.py +400 -0
  119. sqlspec/py.typed +0 -0
  120. sqlspec/storage/__init__.py +23 -0
  121. sqlspec/storage/backends/__init__.py +0 -0
  122. sqlspec/storage/backends/base.py +163 -0
  123. sqlspec/storage/backends/fsspec.py +386 -0
  124. sqlspec/storage/backends/obstore.py +459 -0
  125. sqlspec/storage/capabilities.py +102 -0
  126. sqlspec/storage/registry.py +239 -0
  127. sqlspec/typing.py +299 -0
  128. sqlspec/utils/__init__.py +3 -0
  129. sqlspec/utils/correlation.py +150 -0
  130. sqlspec/utils/deprecation.py +106 -0
  131. sqlspec/utils/fixtures.cp311-win_amd64.pyd +0 -0
  132. sqlspec/utils/fixtures.py +58 -0
  133. sqlspec/utils/logging.py +127 -0
  134. sqlspec/utils/module_loader.py +89 -0
  135. sqlspec/utils/serializers.py +4 -0
  136. sqlspec/utils/singleton.py +32 -0
  137. sqlspec/utils/sync_tools.cp311-win_amd64.pyd +0 -0
  138. sqlspec/utils/sync_tools.py +237 -0
  139. sqlspec/utils/text.cp311-win_amd64.pyd +0 -0
  140. sqlspec/utils/text.py +96 -0
  141. sqlspec/utils/type_guards.cp311-win_amd64.pyd +0 -0
  142. sqlspec/utils/type_guards.py +1135 -0
  143. sqlspec-0.16.0.dist-info/METADATA +365 -0
  144. sqlspec-0.16.0.dist-info/RECORD +148 -0
  145. sqlspec-0.16.0.dist-info/WHEEL +4 -0
  146. sqlspec-0.16.0.dist-info/entry_points.txt +2 -0
  147. sqlspec-0.16.0.dist-info/licenses/LICENSE +21 -0
  148. sqlspec-0.16.0.dist-info/licenses/NOTICE +29 -0
@@ -0,0 +1,396 @@
1
+ """SQL processor with integrated caching and compilation.
2
+
3
+ This module implements the core compilation system for SQL statements with
4
+ integrated parameter processing and caching.
5
+
6
+ Components:
7
+ - CompiledSQL: Immutable compilation result with complete information
8
+ - SQLProcessor: Single-pass compiler with integrated caching
9
+ - Integrated parameter processing via ParameterProcessor
10
+
11
+ Features:
12
+ - Single SQLGlot parse for efficient processing
13
+ - AST-based operation type detection
14
+ - Unified caching system with LRU eviction
15
+ - Complete StatementConfig support
16
+ """
17
+
18
+ import hashlib
19
+ from collections import OrderedDict
20
+ from typing import TYPE_CHECKING, Any, Optional
21
+
22
+ import sqlglot
23
+ from mypy_extensions import mypyc_attr
24
+ from sqlglot import expressions as exp
25
+ from sqlglot.errors import ParseError
26
+ from typing_extensions import Literal
27
+
28
+ from sqlspec.core.parameters import ParameterProcessor
29
+ from sqlspec.utils.logging import get_logger
30
+
31
+ if TYPE_CHECKING:
32
+ from sqlspec.core.statement import StatementConfig
33
+
34
+ # Define OperationType here to avoid circular import
35
+ OperationType = Literal[
36
+ "SELECT",
37
+ "INSERT",
38
+ "UPDATE",
39
+ "DELETE",
40
+ "COPY",
41
+ "COPY_FROM",
42
+ "COPY_TO",
43
+ "EXECUTE",
44
+ "SCRIPT",
45
+ "DDL",
46
+ "PRAGMA",
47
+ "UNKNOWN",
48
+ ]
49
+
50
+
51
+ __all__ = ("CompiledSQL", "OperationType", "SQLProcessor")
52
+
53
+ logger = get_logger("sqlspec.core.compiler")
54
+
55
+ _OPERATION_TYPES = {
56
+ "SELECT": "SELECT",
57
+ "INSERT": "INSERT",
58
+ "UPDATE": "UPDATE",
59
+ "DELETE": "DELETE",
60
+ "COPY": "COPY",
61
+ "COPY_FROM": "COPY_FROM",
62
+ "COPY_TO": "COPY_TO",
63
+ "EXECUTE": "EXECUTE",
64
+ "SCRIPT": "SCRIPT",
65
+ "DDL": "DDL",
66
+ "PRAGMA": "PRAGMA",
67
+ "UNKNOWN": "UNKNOWN",
68
+ }
69
+
70
+
71
+ @mypyc_attr(allow_interpreted_subclasses=True)
72
+ class CompiledSQL:
73
+ """Immutable compiled SQL result with complete information.
74
+
75
+ This class represents the result of SQL compilation, containing all
76
+ information needed for execution.
77
+
78
+ Features:
79
+ - Immutable design for safe sharing
80
+ - Cached hash for efficient dictionary operations
81
+ - Complete operation type detection
82
+ - Parameter style and execution information
83
+ - Support for execute_many operations
84
+ """
85
+
86
+ __slots__ = (
87
+ "_hash",
88
+ "compiled_sql",
89
+ "execution_parameters",
90
+ "expression",
91
+ "operation_type",
92
+ "parameter_style",
93
+ "supports_many",
94
+ )
95
+
96
+ def __init__(
97
+ self,
98
+ compiled_sql: str,
99
+ execution_parameters: Any,
100
+ operation_type: str,
101
+ expression: Optional["exp.Expression"] = None,
102
+ parameter_style: Optional[str] = None,
103
+ supports_many: bool = False,
104
+ ) -> None:
105
+ """Initialize immutable compiled result.
106
+
107
+ Args:
108
+ compiled_sql: Final SQL string ready for execution
109
+ execution_parameters: Parameters in driver-specific format
110
+ operation_type: Detected SQL operation type (SELECT, INSERT, etc.)
111
+ expression: SQLGlot AST expression
112
+ parameter_style: Parameter style used in compilation
113
+ supports_many: Whether this supports execute_many operations
114
+ """
115
+ self.compiled_sql = compiled_sql
116
+ self.execution_parameters = execution_parameters
117
+ self.operation_type = operation_type
118
+ self.expression = expression
119
+ self.parameter_style = parameter_style
120
+ self.supports_many = supports_many
121
+ self._hash: Optional[int] = None
122
+
123
+ def __hash__(self) -> int:
124
+ """Cached hash value."""
125
+ if self._hash is None:
126
+ hash_data = (self.compiled_sql, str(self.execution_parameters), self.operation_type, self.parameter_style)
127
+ self._hash = hash(hash_data)
128
+ return self._hash
129
+
130
+ def __eq__(self, other: object) -> bool:
131
+ """Equality comparison for compiled results."""
132
+ if not isinstance(other, CompiledSQL):
133
+ return False
134
+ return (
135
+ self.compiled_sql == other.compiled_sql
136
+ and self.execution_parameters == other.execution_parameters
137
+ and self.operation_type == other.operation_type
138
+ and self.parameter_style == other.parameter_style
139
+ )
140
+
141
+ def __repr__(self) -> str:
142
+ """String representation for debugging."""
143
+ return (
144
+ f"CompiledSQL(sql={self.compiled_sql!r}, "
145
+ f"params={self.execution_parameters!r}, "
146
+ f"type={self.operation_type!r})"
147
+ )
148
+
149
+
150
+ @mypyc_attr(allow_interpreted_subclasses=True)
151
+ class SQLProcessor:
152
+ """SQL processor with integrated caching and compilation.
153
+
154
+ This is the core compilation engine that processes SQL statements with
155
+ integrated parameter processing and caching.
156
+
157
+ Processing Flow:
158
+ 1. Parameter detection and normalization (if needed)
159
+ 2. Single SQLGlot parse
160
+ 3. AST-based operation type detection
161
+ 4. Parameter conversion (if needed)
162
+ 5. Final SQL generation with execution parameters
163
+
164
+ Features:
165
+ - LRU cache with O(1) operations
166
+ - Integrated parameter processing
167
+ - Cached compilation results
168
+ - Complete StatementConfig support
169
+ """
170
+
171
+ __slots__ = ("_cache", "_cache_hits", "_cache_misses", "_config", "_max_cache_size", "_parameter_processor")
172
+
173
+ def __init__(self, config: "StatementConfig", max_cache_size: int = 1000) -> None:
174
+ """Initialize processor with configuration and caching.
175
+
176
+ Args:
177
+ config: Statement configuration with parameter processing settings
178
+ max_cache_size: Maximum number of cached compilation results
179
+ """
180
+ self._config = config
181
+ self._cache: OrderedDict[str, CompiledSQL] = OrderedDict()
182
+ self._parameter_processor = ParameterProcessor()
183
+ self._max_cache_size = max_cache_size
184
+ self._cache_hits = 0
185
+ self._cache_misses = 0
186
+
187
+ def compile(self, sql: str, parameters: Any = None, is_many: bool = False) -> CompiledSQL:
188
+ """Compile SQL statement with integrated caching.
189
+
190
+ Args:
191
+ sql: Raw SQL string for compilation
192
+ parameters: Parameter values in any format
193
+ is_many: Whether this is for execute_many operation
194
+
195
+ Returns:
196
+ CompiledSQL with all information for execution
197
+ """
198
+ if not self._config.enable_caching:
199
+ return self._compile_uncached(sql, parameters, is_many)
200
+
201
+ cache_key = self._make_cache_key(sql, parameters)
202
+
203
+ if cache_key in self._cache:
204
+ # Move to end for LRU behavior
205
+ result = self._cache[cache_key]
206
+ del self._cache[cache_key]
207
+ self._cache[cache_key] = result
208
+ self._cache_hits += 1
209
+ return result
210
+
211
+ self._cache_misses += 1
212
+ result = self._compile_uncached(sql, parameters, is_many)
213
+
214
+ if len(self._cache) >= self._max_cache_size:
215
+ self._cache.popitem(last=False)
216
+
217
+ self._cache[cache_key] = result
218
+ return result
219
+
220
+ def _compile_uncached(self, sql: str, parameters: Any, is_many: bool = False) -> CompiledSQL:
221
+ """Compile SQL without caching.
222
+
223
+ Args:
224
+ sql: Raw SQL string
225
+ parameters: Parameter values
226
+ is_many: Whether this is for execute_many operation
227
+
228
+ Returns:
229
+ CompiledSQL result
230
+ """
231
+ try:
232
+ dialect_str = str(self._config.dialect) if self._config.dialect else None
233
+ processed_sql, processed_params_tuple = self._parameter_processor.process(
234
+ sql=sql,
235
+ parameters=parameters,
236
+ config=self._config.parameter_config,
237
+ dialect=dialect_str,
238
+ is_many=is_many,
239
+ )
240
+ processed_params: Any = processed_params_tuple
241
+
242
+ if self._config.parameter_config.needs_static_script_compilation and processed_params is None:
243
+ sqlglot_sql = processed_sql
244
+ else:
245
+ sqlglot_sql, _ = self._parameter_processor._get_sqlglot_compatible_sql(
246
+ sql, parameters, self._config.parameter_config, dialect_str
247
+ )
248
+
249
+ final_parameters: Any = processed_params
250
+ ast_was_transformed = False
251
+
252
+ if self._config.enable_parsing:
253
+ try:
254
+ expression = sqlglot.parse_one(sqlglot_sql, dialect=dialect_str)
255
+ operation_type = self._detect_operation_type(expression)
256
+
257
+ if self._config.parameter_config.ast_transformer:
258
+ expression, final_parameters = self._config.parameter_config.ast_transformer(
259
+ expression, processed_params
260
+ )
261
+ ast_was_transformed = True
262
+
263
+ except ParseError:
264
+ expression = None
265
+ operation_type = "EXECUTE"
266
+ else:
267
+ expression = None
268
+ operation_type = "EXECUTE"
269
+
270
+ if self._config.parameter_config.needs_static_script_compilation and processed_params is None:
271
+ final_sql, final_params = processed_sql, processed_params
272
+ elif ast_was_transformed and expression is not None:
273
+ final_sql = expression.sql(dialect=dialect_str)
274
+ final_params = final_parameters
275
+ logger.debug("AST was transformed - final SQL: %s, final params: %s", final_sql, final_params)
276
+ if self._config.output_transformer:
277
+ final_sql, final_params = self._config.output_transformer(final_sql, final_params)
278
+ else:
279
+ final_sql, final_params = self._apply_final_transformations(
280
+ expression, processed_sql, final_parameters, dialect_str
281
+ )
282
+
283
+ return CompiledSQL(
284
+ compiled_sql=final_sql,
285
+ execution_parameters=final_params,
286
+ operation_type=operation_type,
287
+ expression=expression,
288
+ parameter_style=self._config.parameter_config.default_parameter_style.value,
289
+ supports_many=isinstance(final_params, list) and len(final_params) > 0,
290
+ )
291
+
292
+ except Exception as e:
293
+ logger.warning("Compilation failed, using fallback: %s", e)
294
+ return CompiledSQL(
295
+ compiled_sql=sql, execution_parameters=parameters, operation_type=_OPERATION_TYPES["UNKNOWN"]
296
+ )
297
+
298
+ def _make_cache_key(self, sql: str, parameters: Any) -> str:
299
+ """Generate cache key for compilation result.
300
+
301
+ Args:
302
+ sql: SQL string
303
+ parameters: Parameter values
304
+
305
+ Returns:
306
+ Cache key string
307
+ """
308
+ hash_data = (
309
+ sql,
310
+ repr(parameters),
311
+ self._config.parameter_config.default_parameter_style.value,
312
+ str(self._config.dialect),
313
+ self._config.enable_parsing,
314
+ self._config.enable_transformations,
315
+ )
316
+ hash_str = hashlib.sha256(str(hash_data).encode()).hexdigest()[:16]
317
+ return f"sql_{hash_str}"
318
+
319
+ def _detect_operation_type(self, expression: "exp.Expression") -> str:
320
+ """Detect operation type from AST.
321
+
322
+ Uses SQLGlot AST structure to determine operation type.
323
+
324
+ Args:
325
+ expression: SQLGlot AST expression
326
+
327
+ Returns:
328
+ Operation type string
329
+ """
330
+ if isinstance(expression, exp.Select):
331
+ return _OPERATION_TYPES["SELECT"]
332
+ if isinstance(expression, exp.Insert):
333
+ return _OPERATION_TYPES["INSERT"]
334
+ if isinstance(expression, exp.Update):
335
+ return _OPERATION_TYPES["UPDATE"]
336
+ if isinstance(expression, exp.Delete):
337
+ return _OPERATION_TYPES["DELETE"]
338
+ if isinstance(expression, (exp.Create, exp.Drop, exp.Alter)):
339
+ return _OPERATION_TYPES["DDL"]
340
+ if isinstance(expression, exp.Copy):
341
+ if expression.args["kind"] is True:
342
+ return _OPERATION_TYPES["COPY_FROM"]
343
+ if expression.args["kind"] is False:
344
+ return _OPERATION_TYPES["COPY_TO"]
345
+ return _OPERATION_TYPES["COPY"]
346
+ if isinstance(expression, exp.Pragma):
347
+ return _OPERATION_TYPES["PRAGMA"]
348
+ if isinstance(expression, exp.Command):
349
+ return _OPERATION_TYPES["EXECUTE"]
350
+ return _OPERATION_TYPES["UNKNOWN"]
351
+
352
+ def _apply_final_transformations(
353
+ self, expression: "Optional[exp.Expression]", sql: str, parameters: Any, dialect_str: "Optional[str]"
354
+ ) -> "tuple[str, Any]":
355
+ """Apply final transformations.
356
+
357
+ Args:
358
+ expression: SQLGlot AST expression (if available)
359
+ sql: Compiled SQL string (fallback)
360
+ parameters: Execution parameters
361
+ dialect_str: SQL dialect for AST-to-SQL conversion
362
+
363
+ Returns:
364
+ Tuple of (final_sql, final_parameters)
365
+ """
366
+ if self._config.output_transformer:
367
+ if expression is not None:
368
+ ast_sql = expression.sql(dialect=dialect_str)
369
+ return self._config.output_transformer(ast_sql, parameters)
370
+ return self._config.output_transformer(sql, parameters)
371
+
372
+ return sql, parameters
373
+
374
+ def clear_cache(self) -> None:
375
+ """Clear compilation cache."""
376
+ self._cache.clear()
377
+ self._cache_hits = 0
378
+ self._cache_misses = 0
379
+
380
+ @property
381
+ def cache_stats(self) -> "dict[str, int]":
382
+ """Get cache statistics.
383
+
384
+ Returns:
385
+ Dictionary with cache hit/miss statistics
386
+ """
387
+ total_requests = self._cache_hits + self._cache_misses
388
+ hit_rate_pct = int((self._cache_hits / total_requests) * 100) if total_requests > 0 else 0
389
+
390
+ return {
391
+ "hits": self._cache_hits,
392
+ "misses": self._cache_misses,
393
+ "size": len(self._cache),
394
+ "max_size": self._max_cache_size,
395
+ "hit_rate_percent": hit_rate_pct,
396
+ }
Binary file