relationalai 0.11.2__py3-none-any.whl → 0.11.4__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.
Files changed (42) hide show
  1. relationalai/clients/snowflake.py +44 -15
  2. relationalai/clients/types.py +1 -0
  3. relationalai/clients/use_index_poller.py +446 -178
  4. relationalai/early_access/builder/std/__init__.py +1 -1
  5. relationalai/early_access/dsl/bindings/csv.py +4 -4
  6. relationalai/semantics/internal/internal.py +22 -4
  7. relationalai/semantics/lqp/executor.py +69 -18
  8. relationalai/semantics/lqp/intrinsics.py +23 -0
  9. relationalai/semantics/lqp/model2lqp.py +16 -6
  10. relationalai/semantics/lqp/passes.py +3 -4
  11. relationalai/semantics/lqp/primitives.py +38 -14
  12. relationalai/semantics/metamodel/builtins.py +152 -11
  13. relationalai/semantics/metamodel/factory.py +3 -2
  14. relationalai/semantics/metamodel/helpers.py +78 -2
  15. relationalai/semantics/reasoners/graph/core.py +343 -40
  16. relationalai/semantics/reasoners/optimization/solvers_dev.py +20 -1
  17. relationalai/semantics/reasoners/optimization/solvers_pb.py +24 -3
  18. relationalai/semantics/rel/compiler.py +5 -17
  19. relationalai/semantics/rel/executor.py +2 -2
  20. relationalai/semantics/rel/rel.py +6 -0
  21. relationalai/semantics/rel/rel_utils.py +37 -1
  22. relationalai/semantics/rel/rewrite/extract_common.py +153 -242
  23. relationalai/semantics/sql/compiler.py +540 -202
  24. relationalai/semantics/sql/executor/duck_db.py +21 -0
  25. relationalai/semantics/sql/executor/result_helpers.py +7 -0
  26. relationalai/semantics/sql/executor/snowflake.py +9 -2
  27. relationalai/semantics/sql/rewrite/denormalize.py +4 -6
  28. relationalai/semantics/sql/rewrite/recursive_union.py +23 -3
  29. relationalai/semantics/sql/sql.py +120 -46
  30. relationalai/semantics/std/__init__.py +9 -4
  31. relationalai/semantics/std/datetime.py +363 -0
  32. relationalai/semantics/std/math.py +77 -0
  33. relationalai/semantics/std/re.py +83 -0
  34. relationalai/semantics/std/strings.py +1 -1
  35. relationalai/tools/cli_controls.py +445 -60
  36. relationalai/util/format.py +78 -1
  37. {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/METADATA +3 -2
  38. {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/RECORD +41 -39
  39. relationalai/semantics/std/dates.py +0 -213
  40. {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/WHEEL +0 -0
  41. {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/entry_points.txt +0 -0
  42. {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/licenses/LICENSE +0 -0
@@ -2,12 +2,15 @@ from __future__ import annotations
2
2
  from typing import Any, Union
3
3
  import textwrap
4
4
  import uuid
5
+ import time
5
6
 
6
7
  from relationalai.semantics.metamodel.util import ordered_set
7
8
  from relationalai.semantics.internal import internal as b # TODO(coey) change b name or remove b.?
8
9
  from relationalai.semantics.rel.executor import RelExecutor
9
10
  from .common import make_name
10
11
  from relationalai.experimental.solvers import Solver
12
+ from relationalai.tools.constants import DEFAULT_QUERY_TIMEOUT_MINS
13
+ from relationalai.util.timeout import calc_remaining_timeout_minutes
11
14
 
12
15
  _Any = Union[b.Producer, str, float, int]
13
16
  _Number = Union[b.Producer, float, int]
@@ -222,6 +225,14 @@ class SolverModelPB:
222
225
  assert isinstance(executor, RelExecutor)
223
226
  prefix_l = f"solvermodel_{self._id}_"
224
227
 
228
+ query_timeout_mins = kwargs.get("query_timeout_mins", None)
229
+ config = self._model._config
230
+ if query_timeout_mins is None and (timeout_value := config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS)) is not None:
231
+ query_timeout_mins = int(timeout_value)
232
+ config_file_path = getattr(config, 'file_path', None)
233
+ start_time = time.monotonic()
234
+ remaining_timeout_minutes = query_timeout_mins
235
+
225
236
  # 1. Materialize the model and store it.
226
237
  print("export model")
227
238
  b.select(b.count(self.Variable)).to_df() # TODO(coey) weird hack to avoid uninitialized properties error
@@ -244,14 +255,22 @@ class SolverModelPB:
244
255
  def config[:envelope, :payload, :data]: model_string
245
256
  def config[:envelope, :payload, :path]: "{model_uri}"
246
257
  def export {{ config }}
247
- """))
258
+ """), query_timeout_mins=remaining_timeout_minutes)
248
259
 
249
260
  # 2. Execute job and wait for completion.
250
261
  print("execute solver job")
251
- job_id = solver._exec_job(payload, log_to_console=log_to_console)
262
+ remaining_timeout_minutes = calc_remaining_timeout_minutes(
263
+ start_time, query_timeout_mins, config_file_path=config_file_path,
264
+ )
265
+ job_id = solver._exec_job(
266
+ payload, log_to_console=log_to_console, query_timeout_mins=remaining_timeout_minutes,
267
+ )
252
268
 
253
269
  # 3. Extract result.
254
270
  print("extract result")
271
+ remaining_timeout_minutes = calc_remaining_timeout_minutes(
272
+ start_time, query_timeout_mins, config_file_path=config_file_path,
273
+ )
255
274
  extract_str = textwrap.dedent(f"""
256
275
  def raw_result {{
257
276
  load_binary["snowflake://APP_STATE.RAI_INTERNAL_STAGE/job-results/{job_id}/result.binpb"]
@@ -289,7 +308,9 @@ class SolverModelPB:
289
308
  ::std::mirror::convert(std::mirror::typeof[Int128], j, i)
290
309
  )
291
310
  """)
292
- executor.execute_raw(extract_str, readonly=False)
311
+ executor.execute_raw(
312
+ extract_str, readonly=False, query_timeout_mins=remaining_timeout_minutes,
313
+ )
293
314
 
294
315
  print("finished solve")
295
316
  return None
@@ -12,7 +12,7 @@ from relationalai.semantics.metamodel.visitor import ReadWriteVisitor
12
12
  from relationalai.semantics.metamodel.util import OrderedSet, group_by, NameCache, ordered_set
13
13
 
14
14
  from relationalai.semantics.rel import rel, rel_utils as u, builtins as rel_bt
15
- from relationalai.semantics.rel.rewrite import CDC, QuantifyVars
15
+ from relationalai.semantics.rel.rewrite import CDC, QuantifyVars, ExtractCommon
16
16
 
17
17
  import math
18
18
 
@@ -32,7 +32,7 @@ class Compiler(c.Compiler):
32
32
  InferTypes(),
33
33
  DNFUnionSplitter(),
34
34
  ExtractKeys(),
35
- # rewrite.ExtractCommon(),
35
+ ExtractCommon(),
36
36
  Flatten(),
37
37
  Splinter(),
38
38
  QuantifyVars(),
@@ -125,21 +125,6 @@ class ModelToRel:
125
125
  tuple([rel.Annotation("inline", ())]),
126
126
  ))
127
127
 
128
- if "pyrel_num_chars" in reads:
129
- defs.append(
130
- rel.Def("pyrel_num_chars",
131
- tuple([rel.Var("x"), rel.Var("y")]),
132
- rel.Exists(
133
- tuple([rel.Var("z")]),
134
- rel.And(ordered_set(
135
- rel.atom("::std::common::num_chars", tuple([rel.Var("x"), rel.Var("z")])),
136
- rel.Atom(self._convert_abs(types.Int64, types.Int128), tuple([rel.Var("z"), rel.Var("y")])),
137
- )),
138
- ),
139
- tuple([rel.Annotation("inline", ())]),
140
- ),
141
- )
142
-
143
128
  if "pyrel_count" in reads:
144
129
  defs.append(
145
130
  rel.Def("pyrel_count",
@@ -249,6 +234,9 @@ class ModelToRel:
249
234
  ),
250
235
  )
251
236
 
237
+ if "pyrel_regex_search" in reads:
238
+ raise NotImplementedError("pyrel_regex_search is not implemented")
239
+
252
240
  return defs
253
241
 
254
242
  @staticmethod
@@ -305,8 +305,8 @@ class RelExecutor(e.Executor):
305
305
 
306
306
  # NOTE(coey): this is added temporarily to support executing Rel for the solvers library in EA.
307
307
  # It can be removed once this is no longer needed by the solvers library.
308
- def execute_raw(self, raw_rel:str, readonly:bool=True) -> DataFrame:
309
- raw_results = self.resources.exec_raw(self.database, self.engine, raw_rel, readonly, nowait_durable=True)
308
+ def execute_raw(self, raw_rel:str, readonly:bool=True, query_timeout_mins:int|None=None) -> DataFrame:
309
+ raw_results = self.resources.exec_raw(self.database, self.engine, raw_rel, readonly, nowait_durable=True, query_timeout_mins=query_timeout_mins)
310
310
  df, errs = result_helpers.format_results(raw_results, None, generation=Generation.QB) # Pass None for task parameter
311
311
  self.report_errors(errs)
312
312
  return df
@@ -223,6 +223,12 @@ class Printer(BasePrinter):
223
223
  self._print("::std::common::int[128,")
224
224
  self._print(str(value))
225
225
  self._print("]")
226
+ elif isinstance(value, datetime):
227
+ if value.tzinfo is None:
228
+ value = value.replace(tzinfo=timezone.utc)
229
+ self._print(value.astimezone(timezone.utc).isoformat())
230
+ elif isinstance(value, date):
231
+ self._print(value.isoformat())
226
232
  else:
227
233
  self._print(str(value))
228
234
 
@@ -38,25 +38,43 @@ OPERATORS = {
38
38
  "range": "::std::common::range",
39
39
  "hash": "rel_primitive_hash_tuple_uint128",
40
40
  "uuid_to_string": "::std::common::uuid_string",
41
+ "parse_uuid": "::std::common::parse_uuid",
41
42
 
42
43
  # dates
43
44
  "date_year": "::std::common::date_year",
45
+ "date_quarter": "::std::common::date_quarterofyear",
44
46
  "date_month": "::std::common::date_month",
45
47
  "date_week": "::std::common::date_week",
46
48
  "date_day": "::std::common::date_day",
49
+ "date_dayofyear": "::std::common::date_dayofyear",
50
+ "date_weekday": "::std::common::date_dayofweek",
47
51
  "date_add": "::std::common::date_add",
48
52
  "date_subtract": "::std::common::date_subtract",
49
53
  "dates_period_days": "pyrel_dates_period_days",
50
54
  "datetimes_period_milliseconds": "pyrel_datetimes_period_milliseconds",
51
55
  "datetime_add": "::std::common::datetime_add",
56
+ "datetime_year": "::std::common::datetime_year",
57
+ "datetime_quarter": "::std::common::datetime_quarterofyear",
58
+ "datetime_month": "::std::common::datetime_month",
52
59
  "datetime_week": "::std::common::datetime_week",
60
+ "datetime_day": "::std::common::datetime_day",
61
+ "datetime_dayofyear": "::std::common::datetime_dayofyear",
62
+ "datetime_hour": "::std::common::datetime_hour",
63
+ "datetime_minute": "::std::common::datetime_minute",
64
+ "datetime_second": "::std::common::datetime_second",
65
+ "datetime_weekday": "::std::common::datetime_dayofweek",
53
66
  "datetime_subtract": "::std::common::datetime_subtract",
54
67
  "construct_datetime_ms_tz": "::std::common::^DateTime",
55
68
  "date_format": "::std::common::format_date",
56
69
  "datetime_format": "::std::common::format_datetime",
57
70
  "construct_date_from_datetime": "::std::common::^Date",
71
+ "construct_date": "::std::common::^Date",
72
+ "parse_date": "rel_primitive_parse_date",
73
+ "parse_datetime": "rel_primitive_parse_datetime",
58
74
 
59
75
  # periods
76
+ "nanosecond": "::std::common::^Nanosecond",
77
+ "microsecond": "::std::common::^Microsecond",
60
78
  "millisecond": "::std::common::^Millisecond",
61
79
  "second": "::std::common::^Second",
62
80
  "minute": "::std::common::^Minute",
@@ -69,6 +87,8 @@ OPERATORS = {
69
87
  # math
70
88
  "abs": "::std::common::abs",
71
89
  "natural_log": "::std::common::natural_log",
90
+ "log": "::std::common::log",
91
+ "log10": "::std::common::log10",
72
92
  "sqrt": "std::common::sqrt",
73
93
  "maximum": "::std::common::maximum",
74
94
  "minimum": "::std::common::minimum",
@@ -88,6 +108,15 @@ OPERATORS = {
88
108
  "sinh": "rel_primitive_sinh",
89
109
  "asin": "rel_primitive_asin",
90
110
  "asinh": "rel_primitive_asinh",
111
+ "tan": "rel_primitive_tan",
112
+ "tanh": "rel_primitive_tanh",
113
+ "atan": "rel_primitive_atan",
114
+ "atanh": "rel_primitive_atanh",
115
+ "cot": "rel_primitive_cot",
116
+ "acot": "rel_primitive_acot",
117
+ "exp": "rel_primitive_natural_exp",
118
+ "erf": "rel_primitive_error_function",
119
+ "erfinv": "rel_primitive_error_function_inverse",
91
120
 
92
121
  # strings
93
122
  "string": "::std::common::string",
@@ -96,7 +125,7 @@ OPERATORS = {
96
125
  "ends_with": "::std::common::ends_with",
97
126
  "contains": "::std::common::contains",
98
127
  "substring": "::std::common::substring",
99
- "num_chars": "pyrel_num_chars",
128
+ "num_chars": "::std::common::num_chars",
100
129
  "like_match": "::std::common::like_match",
101
130
  "lower": "::std::common::lowercase",
102
131
  "upper": "::std::common::uppercase",
@@ -105,7 +134,14 @@ OPERATORS = {
105
134
  "replace": "rel_primitive_replace",
106
135
  "split": "::std::common::string_split",
107
136
  "split_part": "::std::common::string_split",
137
+
138
+ # regex
108
139
  "regex_match": "rel_primitive_regex_match",
140
+ "regex_match_all": "::std::common::regex_match_all",
141
+ "regex_search": "pyrel_regex_search",
142
+ "capture_group_by_index": "::std::common::capture_group_by_index",
143
+ "capture_group_by_name": "::std::common::capture_group_by_name",
144
+ "escape_regex_metachars": "::std::common::escape_regex_metachars",
109
145
 
110
146
  # ints
111
147
  "parse_int64": "::std::common::parse_int",