datajunction-server 0.0.2.dev4__py3-none-any.whl → 0.0.2.dev5__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.
@@ -2,4 +2,4 @@
2
2
  Version for Hatch
3
3
  """
4
4
 
5
- __version__ = "0.0.2.dev4"
5
+ __version__ = "0.0.2.dev5"
@@ -390,8 +390,11 @@ class Node(Base):
390
390
  for col in self.current.columns
391
391
  if col.dimension_id and col.dimension_column
392
392
  ]
393
+ col_specs = [col.to_spec() for col in self.current.columns]
393
394
  extra_kwargs.update(
394
- primary_key=[col.name for col in self.current.primary_key()],
395
+ primary_key=[
396
+ col.name for col in col_specs if "primary_key" in col.attributes
397
+ ],
395
398
  dimension_links=join_link_specs + ref_link_specs,
396
399
  )
397
400
 
@@ -438,15 +441,6 @@ class Node(Base):
438
441
  node_spec_cls = node_spec_class_map[self.type]
439
442
  return node_spec_cls(**base_kwargs, **extra_kwargs)
440
443
 
441
- @classmethod
442
- def default_load_options(cls) -> List[ExecutableOption]:
443
- return [
444
- joinedload(Node.current).options(*NodeRevision.default_load_options()),
445
- selectinload(Node.tags),
446
- selectinload(Node.created_by),
447
- selectinload(Node.owners),
448
- ]
449
-
450
444
  @classmethod
451
445
  def cube_load_options(cls) -> List[ExecutableOption]:
452
446
  return [
@@ -51,6 +51,7 @@ from datajunction_server.internal.nodes import (
51
51
  create_a_cube,
52
52
  create_a_node,
53
53
  create_a_source_node,
54
+ hard_delete_node,
54
55
  refresh_source,
55
56
  remove_dimension_link,
56
57
  set_node_column_attributes,
@@ -103,18 +104,6 @@ async def safe_task(
103
104
  )
104
105
 
105
106
 
106
- async def find_existing_nodes(
107
- session: AsyncSession,
108
- nodes: list[NodeSpec],
109
- ) -> dict[str, NodeSpec]:
110
- non_cubes = [n.rendered_name for n in nodes if n.node_type != NodeType.CUBE]
111
- cubes = [n.rendered_name for n in nodes if n.node_type == NodeType.CUBE]
112
- all_nodes = await Node.get_by_names(session, non_cubes) + [
113
- await Node.get_cube_by_name(session, cube) for cube in cubes
114
- ]
115
- return {node.name: await node.to_spec(session) for node in all_nodes if node}
116
-
117
-
118
107
  async def deploy(
119
108
  deployment_id: str,
120
109
  deployment: DeploymentSpec,
@@ -149,8 +138,6 @@ async def deploy(
149
138
  current_user,
150
139
  save_history,
151
140
  )
152
-
153
- # async with session_context(request) as session:
154
141
  all_nodes = await NodeNamespace.list_all_nodes(
155
142
  session,
156
143
  deployment.namespace,
@@ -174,7 +161,7 @@ async def deploy(
174
161
  for node_spec in to_skip
175
162
  ],
176
163
  )
177
- if not to_deploy:
164
+ if not to_deploy and not to_delete:
178
165
  logger.info(
179
166
  "No changes detected, skipping deployment. Total elapsed: %.3fs",
180
167
  time.perf_counter() - start_total,
@@ -182,9 +169,10 @@ async def deploy(
182
169
  return deployed_results
183
170
 
184
171
  logger.info(
185
- "Found %d nodes to deploy; skipped %d nodes",
172
+ "Found %d nodes to deploy, skipped %d nodes, deleting %d nodes",
186
173
  len(to_deploy),
187
174
  len(to_skip),
175
+ len(to_delete),
188
176
  )
189
177
 
190
178
  node_graph = extract_node_graph(
@@ -255,9 +243,16 @@ async def deploy(
255
243
  DeploymentStatus.RUNNING,
256
244
  deployed_results,
257
245
  )
246
+
258
247
  logger.info("Starting deletion of %d nodes", len(to_delete))
259
- # for node in to_delete:
260
- # await deactivate_node(session, node.name, current_user, save_history)
248
+ for node_spec in to_delete:
249
+ deployed_results.append(
250
+ await deploy_delete_node(
251
+ node_name=node_spec.rendered_name,
252
+ current_username=current_username,
253
+ save_history=save_history,
254
+ ),
255
+ )
261
256
  logger.info("Finished deploying namespace %s", deployment.namespace)
262
257
  return deployed_results
263
258
 
@@ -417,6 +412,11 @@ def filter_nodes_to_deploy(
417
412
  len(to_skip),
418
413
  [result.rendered_name for result in to_skip],
419
414
  )
415
+ logger.info(
416
+ "Deleting %d nodes: %s",
417
+ len(to_delete),
418
+ to_delete,
419
+ )
420
420
  return to_create + to_update, to_skip, to_delete
421
421
 
422
422
 
@@ -565,7 +565,6 @@ async def deploy_links_for_node(
565
565
  deployment_result = await deploy_dimension_link_from_spec(
566
566
  node_spec=node_spec,
567
567
  link_spec=link,
568
- request=request,
569
568
  current_username=current_username,
570
569
  save_history=save_history,
571
570
  existing_node_links=existing_node_links,
@@ -662,17 +661,17 @@ async def run_tasks_with_semaphore(
662
661
  )
663
662
 
664
663
 
665
- async def deploy_node_tags(node_name: str, node_spec: NodeSpec):
664
+ async def deploy_node_tags(node_name: str, tag_names: list[str]) -> None:
666
665
  async with session_context() as session:
667
666
  node = await Node.get_by_name(session=session, name=node_name)
668
- tags = await get_tags_by_name(session, names=node_spec.tags or [])
667
+ tags = await get_tags_by_name(session, names=tag_names or [])
669
668
  node.tags = tags # type: ignore
670
669
  session.add(node)
671
670
  await session.commit()
672
671
  await session.refresh(node)
673
672
 
674
673
 
675
- async def deploy_column_attributes(
674
+ async def deploy_column_properties(
676
675
  node_name: str,
677
676
  node_spec: NodeSpec,
678
677
  current_username: str,
@@ -685,30 +684,43 @@ async def deploy_column_attributes(
685
684
  desired_column_state = {col.name: col for col in node_spec.columns or []}
686
685
  for col in node.current.columns: # type: ignore
687
686
  if desired_col := desired_column_state.get(col.name):
688
- # If the column is explicitly defined, update its properties to match
689
- if col.display_name != desired_col.display_name:
687
+ # Set column display name and description
688
+ if (
689
+ col.display_name != desired_col.display_name
690
+ and desired_col.display_name is not None
691
+ ):
690
692
  col.display_name = desired_col.display_name
691
693
  changed_columns.add(col.name)
692
694
  if col.description != desired_col.description:
693
695
  col.description = desired_col.description
694
696
  changed_columns.add(col.name)
695
- if desired_col.partition != (
696
- col.partition.to_spec() if col.partition else None
697
- ):
698
- partition = (
699
- Partition(
700
- column_id=col.id,
701
- type_=desired_col.partition.type,
702
- format=desired_col.partition.format,
703
- granularity=desired_col.partition.granularity,
704
- )
705
- if desired_col.partition
706
- else None
697
+
698
+ # Set column partition
699
+ if desired_col.partition is None and col.partition:
700
+ session.delete(col.partition)
701
+ changed_columns.add(col.name)
702
+ elif col.partition is None and desired_col.partition:
703
+ partition = Partition(
704
+ column_id=col.id,
705
+ type_=desired_col.partition.type,
706
+ format=desired_col.partition.format,
707
+ granularity=desired_col.partition.granularity,
707
708
  )
708
- if partition:
709
- session.add(partition)
709
+ session.add(partition)
710
710
  col.partition = partition
711
711
  changed_columns.add(col.name)
712
+ elif (
713
+ desired_col.partition
714
+ and col.partition
715
+ and desired_col.partition != col.partition.to_spec()
716
+ ):
717
+ col.partition.type_ = desired_col.partition.type
718
+ col.partition.format = desired_col.partition.format
719
+ col.partition.granularity = desired_col.partition.granularity
720
+ session.add(col)
721
+ changed_columns.add(col.name)
722
+
723
+ # Set column attributes
712
724
  if set(desired_col.attributes) != set(col.attribute_names()):
713
725
  await set_node_column_attributes(
714
726
  session=session,
@@ -717,6 +729,11 @@ async def deploy_column_attributes(
717
729
  attributes=[
718
730
  AttributeTypeIdentifier(name=attr)
719
731
  for attr in desired_col.attributes
732
+ ]
733
+ + [
734
+ AttributeTypeIdentifier(name=attr)
735
+ for attr in col.attribute_names()
736
+ if attr == "primary_key"
720
737
  ],
721
738
  current_user=current_user,
722
739
  save_history=save_history,
@@ -726,8 +743,14 @@ async def deploy_column_attributes(
726
743
  # If the column is not explicitly defined, reset it to default
727
744
  col.display_name = labelize(col.name)
728
745
  col.description = ""
729
- col.partition = None
730
- col.attributes = []
746
+ if col.partition:
747
+ session.delete(col.partition)
748
+ col.attributes = [
749
+ attr
750
+ for attr in col.attributes
751
+ if attr.attribute_type.name == "primary_key"
752
+ ]
753
+ # col.attributes = [AttributeTypeIdentifier(name=attr) for attr in col.attributes if attr == "primary_key"]
731
754
 
732
755
  session.add(col)
733
756
  await session.commit()
@@ -787,7 +810,7 @@ async def deploy_node_from_spec(
787
810
  ) if changed_fields else ""
788
811
 
789
812
  if set(node_spec.tags) != set([tag.name for tag in node.tags]):
790
- await deploy_node_tags(node_name=node.name, node_spec=node_spec)
813
+ await deploy_node_tags(node_name=node.name, tag_names=node_spec.tags)
791
814
  tags_list = ", ".join([f"`{tag}`" for tag in node_spec.tags])
792
815
  changelog.append(f"└─ Set tags to {tags_list}.")
793
816
  if node.type in (
@@ -796,7 +819,7 @@ async def deploy_node_from_spec(
796
819
  NodeType.DIMENSION,
797
820
  NodeType.CUBE,
798
821
  ):
799
- changed_columns = await deploy_column_attributes(
822
+ changed_columns = await deploy_column_properties(
800
823
  node_name=node.name,
801
824
  node_spec=node_spec,
802
825
  current_username=current_username,
@@ -963,6 +986,12 @@ async def deploy_transform_dimension_node_from_spec(
963
986
  save_history=save_history,
964
987
  cache=cache,
965
988
  )
989
+ created_node = await Node.get_by_name( # type: ignore
990
+ session,
991
+ node_spec.rendered_name,
992
+ options=NodeOutput.load_options(),
993
+ raise_if_not_exists=True,
994
+ )
966
995
  return created_node
967
996
 
968
997
 
@@ -1123,7 +1152,6 @@ async def deploy_cube_node_from_spec(
1123
1152
  async def deploy_dimension_link_from_spec(
1124
1153
  node_spec: NodeSpec,
1125
1154
  link_spec: DimensionLinkSpec,
1126
- request: Request,
1127
1155
  current_username: str,
1128
1156
  save_history: Callable,
1129
1157
  existing_node_links: dict[
@@ -1138,13 +1166,15 @@ async def deploy_dimension_link_from_spec(
1138
1166
  if link_spec.rendered_dimension_node not in existing_node_links
1139
1167
  else DeploymentResult.Operation.UPDATE
1140
1168
  )
1141
- async with session_context(request) as session:
1169
+ async with session_context() as session:
1142
1170
  current_user = cast(
1143
1171
  User,
1144
1172
  await User.get_by_username(session, current_username),
1145
1173
  )
1146
1174
  if link_spec.type == LinkType.JOIN:
1147
- existing = existing_node_links.get(link_spec.rendered_dimension_node)
1175
+ existing = existing_node_links.get(
1176
+ (link_spec.rendered_dimension_node, link_spec.role),
1177
+ )
1148
1178
  join_link = cast(DimensionJoinLinkSpec, link_spec)
1149
1179
  if existing != join_link:
1150
1180
  if join_link.node_column:
@@ -1240,11 +1270,43 @@ async def deploy_remove_dimension_link(
1240
1270
  status=DeploymentResult.Status.SUCCESS,
1241
1271
  operation=DeploymentResult.Operation.DELETE,
1242
1272
  )
1243
- except Exception as exc: # pragma: no cover
1244
- return DeploymentResult( # pragma: no cover
1273
+ except Exception as exc:
1274
+ return DeploymentResult(
1245
1275
  deploy_type=DeploymentResult.Type.LINK,
1246
1276
  name=f"{node_name} -> {link.rendered_dimension_node}",
1247
1277
  status=DeploymentResult.Status.FAILED,
1248
1278
  operation=DeploymentResult.Operation.DELETE,
1249
1279
  message=str(exc),
1250
1280
  )
1281
+
1282
+
1283
+ async def deploy_delete_node(
1284
+ node_name: str,
1285
+ current_username: str,
1286
+ save_history: Callable,
1287
+ ) -> DeploymentResult:
1288
+ async with session_context() as session:
1289
+ current_user = cast(User, await User.get_by_username(session, current_username))
1290
+ try:
1291
+ await hard_delete_node(
1292
+ name=node_name,
1293
+ session=session,
1294
+ current_user=current_user,
1295
+ save_history=save_history,
1296
+ )
1297
+ return DeploymentResult(
1298
+ name=node_name,
1299
+ deploy_type=DeploymentResult.Type.NODE,
1300
+ status=DeploymentResult.Status.SUCCESS,
1301
+ operation=DeploymentResult.Operation.DELETE,
1302
+ message=f"Node {node_name} has been removed.",
1303
+ )
1304
+ except Exception as exc:
1305
+ logger.exception(exc)
1306
+ return DeploymentResult(
1307
+ name=node_name,
1308
+ deploy_type=DeploymentResult.Type.NODE,
1309
+ status=DeploymentResult.Status.FAILED,
1310
+ operation=DeploymentResult.Operation.DELETE,
1311
+ message=str(exc),
1312
+ )
@@ -2746,7 +2746,7 @@ async def hard_delete_node(
2746
2746
  name,
2747
2747
  options=[joinedload(Node.current), joinedload(Node.revisions)],
2748
2748
  include_inactive=True,
2749
- raise_if_not_exists=False,
2749
+ raise_if_not_exists=True,
2750
2750
  )
2751
2751
  downstream_nodes = await get_downstream_nodes(session=session, node_name=name)
2752
2752
 
@@ -5,6 +5,7 @@ from typing import Any, Literal, Union
5
5
 
6
6
  from datajunction_server.models.partition import Granularity, PartitionType
7
7
  from datajunction_server.errors import DJInvalidInputException
8
+ from datajunction_server.models.base import labelize
8
9
  from datajunction_server.models.dimensionlink import JoinType, LinkType
9
10
  from datajunction_server.models.node import (
10
11
  MetricDirection,
@@ -291,11 +292,6 @@ class LinkableNodeSpec(NodeSpec):
291
292
  other.dimension_links or [],
292
293
  key=lambda link: link.rendered_dimension_node,
293
294
  )
294
- print(
295
- "Comparing LinkableNodeSpec",
296
- self.rendered_name,
297
- eq_columns(self.columns, other.columns),
298
- )
299
295
  return (
300
296
  super().__eq__(other)
301
297
  and eq_columns(self.columns, other.columns)
@@ -434,11 +430,6 @@ class CubeSpec(NodeSpec):
434
430
  ]
435
431
 
436
432
  def __eq__(self, other: Any) -> bool:
437
- print(
438
- "Comparing CubeSpec",
439
- self.rendered_name,
440
- eq_columns(self.columns, other.columns),
441
- )
442
433
  return (
443
434
  super().__eq__(other)
444
435
  and eq_columns(self.columns, other.columns)
@@ -575,25 +566,38 @@ def eq_columns(a: list[ColumnSpec] | None, b: list[ColumnSpec] | None) -> bool:
575
566
  - None or [] is considered equivalent to a list where every column only has 'primary_key'
576
567
  in attributes and partition is None.
577
568
  """
578
- a_list = a or []
579
- b_list = b or []
580
-
581
- a_map = {col.name: col for col in a_list}
582
- b_map = {col.name: col for col in b_list}
583
- for col_name, col_a in a_map.items():
584
- col_b = b_map.get(col_name)
585
- if (set(col_a.attributes if col_a else []) - {"primary_key"}) != ( # type: ignore
586
- set(col_b.attributes if col_b else []) - {"primary_key"} # type: ignore
587
- ) or (col_a.partition if col_a else None) != (
588
- col_b.partition if col_b else None
589
- ): # type: ignore
590
- return False
591
- for col_name, col_b in b_map.items():
592
- col_a = a_map.get(col_name) # type: ignore
593
- if (set(col_b.attributes if col_b else []) - {"primary_key"}) != ( # type: ignore
594
- set(col_a.attributes if col_a else []) - {"primary_key"} # type: ignore
595
- ) or (col_b.partition if col_b else None) != (
596
- col_a.partition if col_a else None
597
- ): # type: ignore
598
- return False
599
- return True
569
+ a_map = {col.name: col for col in a or []}
570
+ b_map = {col.name: col for col in b or []}
571
+ a_cols, b_cols = [], []
572
+ for col_name in set(a_map.keys()).union(set(b_map.keys())):
573
+ a_col = a_map.get(col_name)
574
+ b_col = b_map.get(col_name)
575
+ if not a_col:
576
+ a_col = ColumnSpec(
577
+ name=col_name,
578
+ display_name=labelize(col_name),
579
+ type=b_col.type if b_col else "",
580
+ attributes=[],
581
+ )
582
+ if not a_col.display_name:
583
+ a_col.display_name = labelize(col_name)
584
+ if not a_col.description:
585
+ a_col.description = ""
586
+ if not b_col:
587
+ b_col = ColumnSpec(
588
+ name=col_name,
589
+ display_name=labelize(col_name),
590
+ type=a_col.type if a_col else "",
591
+ attributes=[],
592
+ )
593
+ if not b_col.display_name:
594
+ b_col.display_name = labelize(col_name)
595
+ if not b_col.description:
596
+ b_col.description = ""
597
+ if "primary_key" in a_col.attributes:
598
+ a_col.attributes = list(set(a_col.attributes) - {"primary_key"})
599
+ if "primary_key" in b_col.attributes:
600
+ b_col.attributes = list(set(b_col.attributes) - {"primary_key"})
601
+ a_cols.append(a_col)
602
+ b_cols.append(b_col)
603
+ return a_cols == b_cols
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: datajunction-server
3
- Version: 0.0.2.dev4
3
+ Version: 0.0.2.dev5
4
4
  Summary: DataJunction server library for running to a DataJunction server
5
5
  Project-URL: Homepage, https://datajunction.io
6
6
  Project-URL: Repository, https://github.com/DataJunction/dj
@@ -1,4 +1,4 @@
1
- datajunction_server/__about__.py,sha256=7_8nP1iwEx_vfBpO-HcgSpLMpKEmeBk1LgGxMXjgACM,54
1
+ datajunction_server/__about__.py,sha256=s6aBpR8toU4qlGgMXWyqsgZXfKeMKdKuQ7QP7uwKle8,54
2
2
  datajunction_server/__init__.py,sha256=nN5-uJoSVEwuc8n-wMygqeF0Xhxi_zqqbCgutZvAt3E,384
3
3
  datajunction_server/alembic.ini,sha256=mclJ_xx8pHfRyZ69SA9ZPqUwZaaQCTyxZ6wBmbrf1bo,3024
4
4
  datajunction_server/config.py,sha256=L1zkaiF82S-ciR-wVeILx7CWKSOPPJ90a9zooXVNHEc,5641
@@ -128,7 +128,7 @@ datajunction_server/database/materialization.py,sha256=7_w5ay2RXukTaRS03UILsMFrN
128
128
  datajunction_server/database/measure.py,sha256=iwZQIhM-_OlZ4v2a3BmZrhpC4ej-MGh6rLqGB70XGYo,6387
129
129
  datajunction_server/database/metricmetadata.py,sha256=jKh58lOf5_MoFyDTVtpWhK9-Ox22ryWK2XtBKjPApc4,2084
130
130
  datajunction_server/database/namespace.py,sha256=T5GF4eDLgw51xdjWC0T5G_mcAgL4E7OrYuk6x552dhM,5685
131
- datajunction_server/database/node.py,sha256=4BJPUaoYQGz-CtBHPcSB8-I1S4yzkd8-Q2NOvRAtYpk,44951
131
+ datajunction_server/database/node.py,sha256=M9a0BcBvhVtIKrOBxDoBECRzsO8tXkfTagnywjqWgv8,44770
132
132
  datajunction_server/database/nodeowner.py,sha256=YydIO1F-S-J6qyNW8ui71H-l6aENbW7RhdX5koIBq8E,1196
133
133
  datajunction_server/database/notification_preference.py,sha256=uLy60fWLWLJE940Qj7bY0Rq5b5flEkgcq2uxx4pRvPE,1892
134
134
  datajunction_server/database/partition.py,sha256=312KyT0IbaKk-lXxMRvAphJDfA83Wm1RsGp7-dT-U0g,5242
@@ -138,12 +138,12 @@ datajunction_server/database/user.py,sha256=-zW5ssf2IWgSjvZbOljOzVoqynBtNp3gQxHm
138
138
  datajunction_server/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
139
  datajunction_server/internal/client.py,sha256=hpManY1PTGQxAzx4S-1aUAoMvlWfPPU1wgL9iLlAg7o,11442
140
140
  datajunction_server/internal/cube_materializations.py,sha256=SJYIZfjAQr8n-pgECKoroGfOhoR_J0vnMmpCQ0mbLlY,10695
141
- datajunction_server/internal/deployment.py,sha256=N9p5kVllXC61yLX6JXiXRV2P_mjeIt-4gO8fWXm_cVE,45154
141
+ datajunction_server/internal/deployment.py,sha256=snlmwkoWF0tUvIRpMYIhqpw5PYm8uEaqUYcXj1UGWcY,47416
142
142
  datajunction_server/internal/engines.py,sha256=RKIYIYJQMjRIFS7YXIW-q6vLUxilc3sd3eWHwTmDDu0,858
143
143
  datajunction_server/internal/history.py,sha256=MAj2ZTUCGgSLCaS1uB5dWtTqvb2SE_5HHLo0RReCRAc,816
144
144
  datajunction_server/internal/materializations.py,sha256=HVc1RPiarOBksvzyLP8Mt5GFvyEPlOqgIe151I_ZZMY,18184
145
145
  datajunction_server/internal/namespaces.py,sha256=Ff020CvpzWeypqReU5sPl3kNbHj1aQpw_6MI2DJhFSw,20713
146
- datajunction_server/internal/nodes.py,sha256=BbXzMg5G2Tk-xXcBD73UhWR7MQh3B_UeZ9r83LkK8tg,103715
146
+ datajunction_server/internal/nodes.py,sha256=tTS4_oEgtSdf0PVorQ4toEr3iNyIrR8Q0AH4A9fLmWQ,103714
147
147
  datajunction_server/internal/notifications.py,sha256=8aP8KBs8k4kKXnQXIUPWyHa4uKsyV0oERipyP0LR0bs,1724
148
148
  datajunction_server/internal/seed.py,sha256=mc2TQP4dMwAyWTfGKj5b6wK6pvVyU6azHfxSozPElY0,2363
149
149
  datajunction_server/internal/sql.py,sha256=bboANhvtKufVYOOI6RF719GXQFWv-toVXIQQtKIFCtA,18475
@@ -185,7 +185,7 @@ datajunction_server/models/column.py,sha256=3TCa9dDAb9Q2WEAzpcdqAjKSX3PutbwlS8qG
185
185
  datajunction_server/models/cube.py,sha256=p6KmqoOVGlziH5k0wXs6qBvgWWQs984Ho6SGplDbtAQ,4459
186
186
  datajunction_server/models/cube_materialization.py,sha256=ydMRepDM95b4BBVay_nOYlRtK7OFG3pCDDTRdHe2awU,15787
187
187
  datajunction_server/models/database.py,sha256=xhCllbq5ikFNnrPvzuchxQUC9RWogzh73Eqz7Jj0i38,499
188
- datajunction_server/models/deployment.py,sha256=ZCRgGVy_FLHeoLc98-zRz_n79IZAPsr073Y8k4SOhqA,18051
188
+ datajunction_server/models/deployment.py,sha256=DDK-vEoWJWTGX_761kzFtgH3uk4m20jQfxDOSf9O67U,18185
189
189
  datajunction_server/models/dialect.py,sha256=uifriawtKR4vi-GG2rdp4eeQkAkD6iLNuarCLQanTxY,3825
190
190
  datajunction_server/models/dimensionlink.py,sha256=WaCarxhawOiQqtH1EVS0RQRu9D8Bx6GFonLsdSVgXSs,1551
191
191
  datajunction_server/models/engine.py,sha256=Ebuy4HLkURr7mj0pxTj_Y4fEmF0oDen393rnj9fBnR0,466
@@ -226,7 +226,7 @@ datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.py,sha2
226
226
  datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParser.tokens,sha256=JDrzbaKDwIaimAZPYIUzCgzkOEgq0X5-a6_lz78lqgs,8131
227
227
  datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserListener.py,sha256=vp8wduYkB-T5Xr6HZCSdzAxTHHPrDI5UJZXRJSVhAGA,102464
228
228
  datajunction_server/sql/parsing/backends/grammar/generated/SqlBaseParserVisitor.py,sha256=w3V03LgPIHCiqojNyuekBDYqskjOKlKrd0sczQAB_WQ,60290
229
- datajunction_server-0.0.2.dev4.dist-info/METADATA,sha256=h0bsPkDT6voeOPRcczUx6yrmvivISRd09p51Kq40Qq4,3769
230
- datajunction_server-0.0.2.dev4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
231
- datajunction_server-0.0.2.dev4.dist-info/entry_points.txt,sha256=MOInJGdcQ10bDEl-XW4UMokEgx-ypINqBhObeDI8KiQ,74
232
- datajunction_server-0.0.2.dev4.dist-info/RECORD,,
229
+ datajunction_server-0.0.2.dev5.dist-info/METADATA,sha256=wMmDeSs0m497HHgebVNxT01FnVOg9esWyRtkzfvbLx8,3769
230
+ datajunction_server-0.0.2.dev5.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
231
+ datajunction_server-0.0.2.dev5.dist-info/entry_points.txt,sha256=MOInJGdcQ10bDEl-XW4UMokEgx-ypINqBhObeDI8KiQ,74
232
+ datajunction_server-0.0.2.dev5.dist-info/RECORD,,