omnata-plugin-runtime 0.10.10a261__tar.gz → 0.10.12__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: omnata-plugin-runtime
3
- Version: 0.10.10a261
3
+ Version: 0.10.12
4
4
  Summary: Classes and common runtime components for building and running Omnata Plugins
5
5
  Author: James Weakley
6
6
  Author-email: james.weakley@omnata.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "omnata-plugin-runtime"
3
- version = "0.10.10-a261"
3
+ version = "0.10.12"
4
4
  description = "Classes and common runtime components for building and running Omnata Plugins"
5
5
  authors = ["James Weakley <james.weakley@omnata.com>"]
6
6
  readme = "README.md"
@@ -463,6 +463,12 @@ class SnowflakeViewParts(BaseModel):
463
463
  There will be a final SELECT statement that selects all columns from the main stream, and then adds any columns obtained via joins.
464
464
  In the final select statement, the join columns will be aliased with their transformed names.
465
465
  """
466
+ # Deduplicate the joined parts
467
+ joined_parts_deduped:List[SnowflakeViewPart] = []
468
+ for part in self.joined_parts:
469
+ if part.stream_name!=self.main_part.stream_name and part.stream_name not in [p.stream_name for p in joined_parts_deduped]:
470
+ joined_parts_deduped.append(part)
471
+
466
472
  # first, we need to collapse all referenced columns into a single map
467
473
  all_referenced_columns:Dict[str,List[str]] = {}
468
474
  for part in [self.main_part] + self.joined_parts:
@@ -566,35 +572,40 @@ class SnowflakeViewParts(BaseModel):
566
572
 
567
573
  return cls(main_part=main_stream_view_part, joined_parts=joined_parts)
568
574
 
569
- def prune(view_part:SnowflakeViewPart,joined_parts:List[SnowflakeViewPart]) -> bool:
575
+ def prune(view_part: SnowflakeViewPart, joined_parts: List[SnowflakeViewPart]) -> bool:
570
576
  """
571
- Prunes columns from the main view part that reference fields that are not available in the joined parts.
572
- Returns True if columns were removed, False otherwise.
577
+ Iteratively prunes columns from the main view part that reference fields
578
+ that are not available in the joined parts.
573
579
  """
574
- for column in view_part.columns:
575
- if column.referenced_columns:
576
- for referenced_stream_name, referenced_fields in column.referenced_columns.items():
577
-
578
- if referenced_stream_name == view_part.stream_name:
579
- part = view_part
580
- else:
581
- part = next((part for part in joined_parts if part.stream_name==referenced_stream_name),None)
582
- if part is None:
583
- logger.warning(f"Column {column.name} in stream {view_part.stream_name} references stream {referenced_stream_name}, but it was not provided")
584
- view_part.columns.remove(column)
585
- return True
586
-
587
- columns_missing_from_join = part.columns_missing(referenced_fields)
588
- if len(columns_missing_from_join) > 0:
589
- logger.warning(f"Column {column.name} in stream {view_part.stream_name} references fields {columns_missing_from_join} in stream {referenced_stream_name}, but they were not provided")
590
- view_part.columns.remove(column)
591
- return True
592
- else:
593
- # no columns were removed, but we need to check if the columns that are referenced are not themselves referencing other missing columns
594
- if part != view_part:
595
- return prune(part,joined_parts)
596
-
597
- return False
580
+ stack = [(view_part, joined_parts)]
581
+ columns_removed = False
582
+
583
+ while stack:
584
+ current_part, current_joined_parts = stack.pop()
585
+ for column in current_part.columns[:]: # Iterate over a copy to allow safe removal
586
+ if column.referenced_columns:
587
+ for referenced_stream_name, referenced_fields in column.referenced_columns.items():
588
+ if referenced_stream_name == current_part.stream_name:
589
+ part = current_part
590
+ else:
591
+ part = next((p for p in current_joined_parts if p.stream_name == referenced_stream_name), None)
592
+ if part is None:
593
+ logger.warning(f"Column {column.name} in stream {current_part.stream_name} references stream {referenced_stream_name}, but it was not provided")
594
+ current_part.columns.remove(column)
595
+ columns_removed = True
596
+ break
597
+
598
+ columns_missing_from_join = part.columns_missing(referenced_fields)
599
+ if columns_missing_from_join:
600
+ logger.warning(f"Column {column.name} in stream {current_part.stream_name} references fields {columns_missing_from_join} in stream {referenced_stream_name}, but they were not provided")
601
+ current_part.columns.remove(column)
602
+ columns_removed = True
603
+ break
604
+ else:
605
+ if part != current_part:
606
+ stack.append((part, current_joined_parts))
607
+
608
+ return columns_removed
598
609
 
599
610
  class JsonSchemaTopLevel(BaseModel):
600
611
  """