# Licensed to the Apache Software Foundation (ASF) under one# or more contributor license agreements. See the NOTICE file# distributed with this work for additional information# regarding copyright ownership. The ASF licenses this file# to you under the Apache License, Version 2.0 (the# "License"); you may not use this file except in compliance# with the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing,# software distributed under the License is distributed on an# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY# KIND, either express or implied. See the License for the# specific language governing permissions and limitations# under the License.from__future__importannotationsimporttypingfromairflow.datasetsimportBaseDatasetEventInput,DatasetAllfromairflow.exceptionsimportAirflowTimetableInvalidfromairflow.timetables.simpleimportDatasetTriggeredTimetableasDatasetTriggeredSchedulefromairflow.utils.typesimportDagRunTypeiftyping.TYPE_CHECKING:fromcollections.abcimportCollectionimportpendulumfromairflow.datasetsimportDatasetfromairflow.timetables.baseimportDagRunInfo,DataInterval,TimeRestriction,Timetable
[docs]classDatasetOrTimeSchedule(DatasetTriggeredSchedule):"""Combine time-based scheduling with event-based scheduling."""def__init__(self,*,timetable:Timetable,datasets:Collection[Dataset]|BaseDatasetEventInput,)->None:self.timetable=timetableifisinstance(datasets,BaseDatasetEventInput):self.datasets=datasetselse:self.datasets=DatasetAll(*datasets)self.description=f"Triggered by datasets or {timetable.description}"self.periodic=timetable.periodicself._can_be_scheduled=timetable._can_be_scheduledself.active_runs_limit=timetable.active_runs_limit@classmethod
[docs]defdeserialize(cls,data:dict[str,typing.Any])->Timetable:fromairflow.serialization.serialized_objectsimportdecode_timetablereturncls(timetable=decode_timetable(data["timetable"]),# don't need the datasets after deserialization# they are already stored on dataset_triggers attr on DAG# and this is what scheduler looks atdatasets=[],)
[docs]defvalidate(self)->None:ifisinstance(self.timetable,DatasetTriggeredSchedule):raiseAirflowTimetableInvalid("cannot nest dataset timetables")ifnotisinstance(self.datasets,BaseDatasetEventInput):raiseAirflowTimetableInvalid("all elements in 'datasets' must be datasets")
@property
[docs]defsummary(self)->str:returnf"Dataset or {self.timetable.summary}"