industrial-model 0.1.23__tar.gz → 0.1.25__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.
Files changed (49) hide show
  1. {industrial_model-0.1.23 → industrial_model-0.1.25}/PKG-INFO +1 -1
  2. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/filter_mapper.py +14 -4
  3. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/queries/models.py +5 -5
  4. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/queries/params.py +16 -4
  5. {industrial_model-0.1.23 → industrial_model-0.1.25}/pyproject.toml +1 -1
  6. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/models.py +1 -1
  7. industrial_model-0.1.25/tests/tests_query.py +33 -0
  8. {industrial_model-0.1.23 → industrial_model-0.1.25}/uv.lock +1 -1
  9. {industrial_model-0.1.23 → industrial_model-0.1.25}/.gitignore +0 -0
  10. {industrial_model-0.1.23 → industrial_model-0.1.25}/.python-version +0 -0
  11. {industrial_model-0.1.23 → industrial_model-0.1.25}/README.md +0 -0
  12. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/__init__.py +0 -0
  13. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/__init__.py +0 -0
  14. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/aggregation_mapper.py +0 -0
  15. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/models.py +0 -0
  16. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/optimizer.py +0 -0
  17. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/query_mapper.py +0 -0
  18. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/query_result_mapper.py +0 -0
  19. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/search_mapper.py +0 -0
  20. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/sort_mapper.py +0 -0
  21. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/upsert_mapper.py +0 -0
  22. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/utils.py +0 -0
  23. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/cognite_adapters/view_mapper.py +0 -0
  24. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/config.py +0 -0
  25. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/constants.py +0 -0
  26. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/engines/__init__.py +0 -0
  27. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/engines/async_engine.py +0 -0
  28. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/engines/engine.py +0 -0
  29. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/models/__init__.py +0 -0
  30. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/models/base.py +0 -0
  31. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/models/entities.py +0 -0
  32. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/models/schemas.py +0 -0
  33. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/py.typed +0 -0
  34. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/queries/__init__.py +0 -0
  35. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/statements/__init__.py +0 -0
  36. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/statements/expressions.py +0 -0
  37. {industrial_model-0.1.23 → industrial_model-0.1.25}/industrial_model/utils.py +0 -0
  38. {industrial_model-0.1.23 → industrial_model-0.1.25}/scripts/build.sh +0 -0
  39. {industrial_model-0.1.23 → industrial_model-0.1.25}/scripts/format.sh +0 -0
  40. {industrial_model-0.1.23 → industrial_model-0.1.25}/scripts/lint.sh +0 -0
  41. {industrial_model-0.1.23 → industrial_model-0.1.25}/scripts/publish.sh +0 -0
  42. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/__init__.py +0 -0
  43. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/cognite-sdk-config.yaml +0 -0
  44. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/hubs.py +0 -0
  45. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/test_schema.py +0 -0
  46. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/tests_adapter.py +0 -0
  47. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/tests_aggregate.py +0 -0
  48. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/tests_search.py +0 -0
  49. {industrial_model-0.1.23 → industrial_model-0.1.25}/tests/tests_upsert_mapper.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: industrial-model
3
- Version: 0.1.23
3
+ Version: 0.1.25
4
4
  Summary: Industrial Model ORM
5
5
  Author-email: Lucas Alves <lucasrosaalves@gmail.com>
6
6
  Classifier: Programming Language :: Python
@@ -1,9 +1,11 @@
1
1
  from datetime import date, datetime
2
+ from typing import Any
2
3
 
3
4
  import cognite.client.data_classes.filters as cdf_filters
4
5
  from cognite.client.data_classes.data_modeling import MappedProperty, View
5
6
 
6
7
  from industrial_model.cognite_adapters.utils import get_property_ref
8
+ from industrial_model.models.entities import InstanceId
7
9
  from industrial_model.statements import (
8
10
  BoolExpression,
9
11
  Expression,
@@ -54,11 +56,8 @@ class FilterMapper:
54
56
  property_ref = get_property_ref(expression.property, root_view)
55
57
 
56
58
  value_ = expression.value
57
- if isinstance(value_, datetime):
58
- value_ = datetime_to_ms_iso_timestamp(value_)
59
59
 
60
- if isinstance(value_, date):
61
- value_ = value_.strftime("%Y-%m-%d")
60
+ value_ = self._handle_type_value_convertion(value_)
62
61
 
63
62
  if expression.operator == "==":
64
63
  return cdf_filters.Equals(property_ref, value_)
@@ -96,3 +95,14 @@ class FilterMapper:
96
95
  assert isinstance(view_definiton, MappedProperty)
97
96
  assert view_definiton.source
98
97
  return self._view_mapper.get_view(view_definiton.source.external_id)
98
+
99
+ def _handle_type_value_convertion(self, value_: Any) -> Any:
100
+ if isinstance(value_, datetime):
101
+ return datetime_to_ms_iso_timestamp(value_)
102
+ elif isinstance(value_, date):
103
+ return value_.strftime("%Y-%m-%d")
104
+ elif isinstance(value_, InstanceId):
105
+ return value_.model_dump(mode="json", by_alias=True)
106
+ elif isinstance(value_, list):
107
+ return [self._handle_type_value_convertion(v) for v in value_]
108
+ return value_
@@ -18,7 +18,7 @@ class BaseQuery(RootModel):
18
18
 
19
19
  for key, item in self.__class__.model_fields.items():
20
20
  values = getattr(self, key)
21
- if not values:
21
+ if values is None:
22
22
  continue
23
23
  for metadata_item in item.metadata:
24
24
  if isinstance(metadata_item, SortParam):
@@ -43,7 +43,7 @@ class BasePaginatedQuery(BaseQuery):
43
43
 
44
44
  class BaseSearchQuery(RootModel):
45
45
  query: str | None = None
46
- query_properties: list[str] | list[Any] | None = None
46
+ query_properties: list[Any] | None = None
47
47
  limit: int = 1000
48
48
 
49
49
  def to_statement(
@@ -53,7 +53,7 @@ class BaseSearchQuery(RootModel):
53
53
 
54
54
  for key, item in self.__class__.model_fields.items():
55
55
  values = getattr(self, key)
56
- if not values:
56
+ if values is None:
57
57
  continue
58
58
  for metadata_item in item.metadata:
59
59
  if isinstance(metadata_item, SortParam):
@@ -69,7 +69,7 @@ class BaseSearchQuery(RootModel):
69
69
 
70
70
  class BaseAggregationQuery(RootModel):
71
71
  aggregate: AggregateTypes | None = None
72
- group_by_properties: list[str] | list[Any] | None = None
72
+ group_by_properties: list[Any] | None = None
73
73
  aggregation_property: str | None = None
74
74
  limit: int | None = None
75
75
 
@@ -80,7 +80,7 @@ class BaseAggregationQuery(RootModel):
80
80
 
81
81
  for key, item in self.__class__.model_fields.items():
82
82
  values = getattr(self, key)
83
- if not values:
83
+ if values is None:
84
84
  continue
85
85
  for metadata_item in item.metadata:
86
86
  if isinstance(metadata_item, QueryParam | NestedQueryParam):
@@ -5,7 +5,7 @@ from industrial_model.constants import (
5
5
  LEAF_EXPRESSION_OPERATORS,
6
6
  SORT_DIRECTION,
7
7
  )
8
- from industrial_model.statements import LeafExpression
8
+ from industrial_model.statements import BoolExpression, Expression, LeafExpression
9
9
 
10
10
 
11
11
  @dataclass
@@ -13,9 +13,21 @@ class QueryParam:
13
13
  property: str
14
14
  operator: LEAF_EXPRESSION_OPERATORS
15
15
 
16
- def to_expression(self, value: Any) -> LeafExpression:
16
+ def to_expression(self, value: Any) -> Expression:
17
17
  if self.operator == "nested":
18
- raise ValueError("Can not have nested operator on QuertParam")
18
+ raise ValueError(
19
+ "Nested operator not allowed in QueryParam - use NestedQueryParam"
20
+ )
21
+
22
+ if self.operator == "exists" and isinstance(value, bool) and not value:
23
+ return BoolExpression(
24
+ operator="not",
25
+ filters=[
26
+ LeafExpression(
27
+ property=self.property, operator=self.operator, value=True
28
+ )
29
+ ],
30
+ )
19
31
 
20
32
  return LeafExpression(
21
33
  property=self.property,
@@ -29,7 +41,7 @@ class NestedQueryParam:
29
41
  property: str
30
42
  value: QueryParam
31
43
 
32
- def to_expression(self, value: Any) -> LeafExpression:
44
+ def to_expression(self, value: Any) -> Expression:
33
45
  return LeafExpression(
34
46
  property=self.property,
35
47
  operator="nested",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "industrial-model"
3
- version = "0.1.23"
3
+ version = "0.1.25"
4
4
  description = "Industrial Model ORM"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -37,7 +37,7 @@ class Event(ViewInstance):
37
37
  view_external_id="OEEEvent",
38
38
  instance_spaces_prefix="OEE-",
39
39
  )
40
-
40
+ event_definition: str | None = None
41
41
  start_date_time: datetime.datetime | None = None
42
42
  ref_site: ReportingSite | None = None
43
43
  ref_unit: DescribableEntity | None = None
@@ -0,0 +1,33 @@
1
+ import datetime
2
+ import json
3
+ from typing import Annotated
4
+
5
+ from industrial_model.queries.models import BasePaginatedQuery
6
+ from industrial_model.queries.params import QueryParam
7
+
8
+ from .hubs import generate_engine
9
+ from .models import Event
10
+
11
+ if __name__ == "__main__":
12
+ adapter = generate_engine()
13
+
14
+ class EventRequest(BasePaginatedQuery):
15
+ start_date_time_gt: Annotated[
16
+ datetime.datetime | None,
17
+ QueryParam(property="startDateTime", operator=">"),
18
+ ] = None
19
+ event_definition_exists: Annotated[
20
+ bool | None, QueryParam(property="eventDefinition", operator="exists")
21
+ ] = None
22
+
23
+ filter = EventRequest(
24
+ start_date_time_gt=datetime.datetime(2025, 3, 1),
25
+ event_definition_exists=False,
26
+ limit=1,
27
+ )
28
+
29
+ statement = filter.to_statement(Event)
30
+
31
+ result = adapter.query(statement)
32
+ print(len(result.data))
33
+ json.dump(result.model_dump(mode="json"), open("events.json", "w"), indent=2)
@@ -215,7 +215,7 @@ wheels = [
215
215
 
216
216
  [[package]]
217
217
  name = "industrial-model"
218
- version = "0.1.23"
218
+ version = "0.1.25"
219
219
  source = { editable = "." }
220
220
  dependencies = [
221
221
  { name = "anyio" },