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.
- relationalai/clients/snowflake.py +44 -15
- relationalai/clients/types.py +1 -0
- relationalai/clients/use_index_poller.py +446 -178
- relationalai/early_access/builder/std/__init__.py +1 -1
- relationalai/early_access/dsl/bindings/csv.py +4 -4
- relationalai/semantics/internal/internal.py +22 -4
- relationalai/semantics/lqp/executor.py +69 -18
- relationalai/semantics/lqp/intrinsics.py +23 -0
- relationalai/semantics/lqp/model2lqp.py +16 -6
- relationalai/semantics/lqp/passes.py +3 -4
- relationalai/semantics/lqp/primitives.py +38 -14
- relationalai/semantics/metamodel/builtins.py +152 -11
- relationalai/semantics/metamodel/factory.py +3 -2
- relationalai/semantics/metamodel/helpers.py +78 -2
- relationalai/semantics/reasoners/graph/core.py +343 -40
- relationalai/semantics/reasoners/optimization/solvers_dev.py +20 -1
- relationalai/semantics/reasoners/optimization/solvers_pb.py +24 -3
- relationalai/semantics/rel/compiler.py +5 -17
- relationalai/semantics/rel/executor.py +2 -2
- relationalai/semantics/rel/rel.py +6 -0
- relationalai/semantics/rel/rel_utils.py +37 -1
- relationalai/semantics/rel/rewrite/extract_common.py +153 -242
- relationalai/semantics/sql/compiler.py +540 -202
- relationalai/semantics/sql/executor/duck_db.py +21 -0
- relationalai/semantics/sql/executor/result_helpers.py +7 -0
- relationalai/semantics/sql/executor/snowflake.py +9 -2
- relationalai/semantics/sql/rewrite/denormalize.py +4 -6
- relationalai/semantics/sql/rewrite/recursive_union.py +23 -3
- relationalai/semantics/sql/sql.py +120 -46
- relationalai/semantics/std/__init__.py +9 -4
- relationalai/semantics/std/datetime.py +363 -0
- relationalai/semantics/std/math.py +77 -0
- relationalai/semantics/std/re.py +83 -0
- relationalai/semantics/std/strings.py +1 -1
- relationalai/tools/cli_controls.py +445 -60
- relationalai/util/format.py +78 -1
- {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/METADATA +3 -2
- {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/RECORD +41 -39
- relationalai/semantics/std/dates.py +0 -213
- {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/WHEEL +0 -0
- {relationalai-0.11.2.dist-info → relationalai-0.11.4.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
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(
|
|
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
|
-
|
|
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": "
|
|
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",
|