ransacklib 1.1.0.dev2__tar.gz → 1.1.0.dev3__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.
- {ransacklib-1.1.0.dev2/ransacklib.egg-info → ransacklib-1.1.0.dev3}/PKG-INFO +1 -1
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/pyproject.toml +1 -1
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/operator.py +26 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/transformer.py +30 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3/ransacklib.egg-info}/PKG-INFO +1 -1
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/LICENSE +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/README.rst +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/__init__.py +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/exceptions.py +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/function.py +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/parser.py +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransack/py.typed +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/SOURCES.txt +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/dependency_links.txt +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/requires.txt +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/ransacklib.egg-info/top_level.txt +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/setup.cfg +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/tests/test_operator.py +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/tests/test_parser.py +0 -0
- {ransacklib-1.1.0.dev2 → ransacklib-1.1.0.dev3}/tests/test_transformer.py +0 -0
|
@@ -546,10 +546,36 @@ def _operator_map_sql(op, l_sql, r_sql, t1, t2) -> tuple[str, Any]:
|
|
|
546
546
|
"or": {(bool, bool): f"{l_sql} OR {r_sql}"},
|
|
547
547
|
"contains": {(str, str): f"position({r_sql} in {l_sql})>0"},
|
|
548
548
|
}
|
|
549
|
+
d2: dict[str, dict] = {
|
|
550
|
+
"+": {
|
|
551
|
+
(Number, Number): (f"{l_sql} + {r_sql}", Number),
|
|
552
|
+
(datetime, timedelta): (f"{l_sql} + {r_sql}", datetime),
|
|
553
|
+
(timedelta, timedelta): (f"{l_sql} + {r_sql}", timedelta),
|
|
554
|
+
},
|
|
555
|
+
"-": {
|
|
556
|
+
(Number, Number): (f"{l_sql} - {r_sql}", Number),
|
|
557
|
+
(datetime, timedelta): (f"{l_sql} - {r_sql}", datetime),
|
|
558
|
+
(timedelta, timedelta): (f"{l_sql} - {r_sql}", timedelta),
|
|
559
|
+
(datetime, datetime): (f"{l_sql} - {r_sql}", timedelta),
|
|
560
|
+
},
|
|
561
|
+
"*": {
|
|
562
|
+
(timedelta, Number): (f"{l_sql} * {r_sql}", timedelta),
|
|
563
|
+
(Number, Number): (f"{l_sql} * {r_sql}", Number),
|
|
564
|
+
},
|
|
565
|
+
"/": {
|
|
566
|
+
(timedelta, timedelta): (f"{l_sql} / {r_sql}", timedelta),
|
|
567
|
+
(Number, Number): (f"{l_sql} / {r_sql}", Number),
|
|
568
|
+
},
|
|
569
|
+
"%": {
|
|
570
|
+
(Number, Number): (f"{l_sql} % {r_sql}", timedelta),
|
|
571
|
+
},
|
|
572
|
+
}
|
|
549
573
|
if op == "==":
|
|
550
574
|
return (f"{l_sql} = {r_sql}", bool)
|
|
551
575
|
if op == "in":
|
|
552
576
|
return (d["="][(t1, t2)], bool)
|
|
577
|
+
if op in d2:
|
|
578
|
+
return d2[op][(t1, t2)]
|
|
553
579
|
return (d[op][(t1, t2)], bool)
|
|
554
580
|
|
|
555
581
|
|
|
@@ -924,6 +924,21 @@ class SQLInterpreter(Interpreter):
|
|
|
924
924
|
|
|
925
925
|
return binary_operation_sql(operator, l_sql, r_sql, l_type, r_type)
|
|
926
926
|
|
|
927
|
+
def add(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
|
|
928
|
+
return self._binary_operation("+", l_tree, r_tree)
|
|
929
|
+
|
|
930
|
+
def sub(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
|
|
931
|
+
return self._binary_operation("-", l_tree, r_tree)
|
|
932
|
+
|
|
933
|
+
def mul(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
|
|
934
|
+
return self._binary_operation("*", l_tree, r_tree)
|
|
935
|
+
|
|
936
|
+
def div(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
|
|
937
|
+
return self._binary_operation("/", l_tree, r_tree)
|
|
938
|
+
|
|
939
|
+
def mod(self, l_tree: Tree, r_tree: Tree) -> tuple[str, Any]:
|
|
940
|
+
return self._binary_operation("-", l_tree, r_tree)
|
|
941
|
+
|
|
927
942
|
def eq(self, l_tree: Tree, r_tree: Tree) -> tuple[str, type[bool]]:
|
|
928
943
|
return self._binary_operation("==", l_tree, r_tree)
|
|
929
944
|
|
|
@@ -966,3 +981,18 @@ class SQLInterpreter(Interpreter):
|
|
|
966
981
|
var, _ = self.var_from_data(TokenWrapper(path, path))
|
|
967
982
|
sql, type_ = self.visit(default)
|
|
968
983
|
return f"COALESCE({var!s}, {sql})", type_
|
|
984
|
+
|
|
985
|
+
def function_(self, name: TokenWrapper, args: Tree | None) -> tuple[str, Any]:
|
|
986
|
+
function_name = cast("str", name.real_value)
|
|
987
|
+
args = [self.visit(x) for x in (args.children if args else [])] # type: ignore
|
|
988
|
+
if function_name == "now":
|
|
989
|
+
return "localtimestamp", datetime
|
|
990
|
+
raise EvaluationError(
|
|
991
|
+
f"Function '{name.real_value}' was not found.",
|
|
992
|
+
line=name.line,
|
|
993
|
+
column=name.column,
|
|
994
|
+
start_pos=name.start_pos,
|
|
995
|
+
end_line=name.end_line,
|
|
996
|
+
end_column=name.end_column,
|
|
997
|
+
end_pos=name.end_pos,
|
|
998
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|