|
1 | 1 | package ai.chronon.spark.batch |
2 | 2 |
|
3 | 3 | import ai.chronon.api |
4 | | -import ai.chronon.api.Extensions.{JoinOps, MetadataOps, SourceOps} |
| 4 | +import ai.chronon.api.Extensions.{GroupByOps, JoinOps, MetadataOps, SourceOps} |
5 | 5 | import ai.chronon.api.ScalaJavaConversions.IterableOps |
6 | | -import ai.chronon.api.{DateRange, MetaData, PartitionRange} |
| 6 | +import ai.chronon.api.{Accuracy, DataModel, DateRange, MetaData, PartitionRange, PartitionSpec} |
7 | 7 | import ai.chronon.planner.{JoinBootstrapNode, JoinDerivationNode, JoinMergeNode, JoinPartNode, SourceWithFilterNode} |
8 | 8 | import ai.chronon.spark.JoinUtils |
9 | 9 | import ai.chronon.spark.catalog.TableUtils |
@@ -124,7 +124,15 @@ class ModularMonolith(join: api.Join, dateRange: DateRange)(implicit tableUtils: |
124 | 124 | .setSkewKeys(join.skewKeys) |
125 | 125 |
|
126 | 126 | StepRunner(dateRange, partMetaData) { stepRange => |
127 | | - val joinPartJob = new JoinPartJob(joinPartNode, partMetaData, stepRange) |
| 127 | + val shiftedRange = if (join.left.dataModel == DataModel.EVENTS && joinPart.groupBy.inferredAccuracy == Accuracy.SNAPSHOT) { |
| 128 | + val spec = PartitionSpec.daily |
| 129 | + new DateRange() |
| 130 | + .setStartDate(spec.before(stepRange.startDate)) |
| 131 | + .setEndDate(spec.before(stepRange.endDate)) |
| 132 | + } else { |
| 133 | + stepRange |
| 134 | + } |
| 135 | + val joinPartJob = new JoinPartJob(joinPartNode, partMetaData, shiftedRange, alignOutput = true) |
128 | 136 | joinPartJob.run(None) // Run without context for now |
129 | 137 | } |
130 | 138 | logger.info(s"JoinPartJob completed for: $joinPartGroupByName, output table: $partFullTableName") |
|
0 commit comments