<!--
/**
 * 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.
 */
 -->
<coordinator-app xmlns="uri:oozie:coordinator:0.5" name="NAME"
    frequency="${coord:days(1)}" start="2009-02-01T01:00Z" end="2009-02-03T23:59Z"
    timezone="UTC">
    <controls>
        <concurrency>2</concurrency>
        <execution>LIFO</execution>
    </controls>
    <datasets>

        <dataset name="a" frequency="${coord:days(1)}"
            initial-instance="2009-01-01T01:00Z" timezone="UTC">
            <uri-template>${data_set_a}
            </uri-template>
        </dataset>

        <dataset name="b" frequency="${coord:days(1)}"
            initial-instance="2009-01-01T01:00Z" timezone="UTC">
            <uri-template>${data_set_b}
            </uri-template>
        </dataset>
        <dataset name="c" frequency="${coord:days(1)}"
            initial-instance="2009-01-01T01:00Z" timezone="UTC">
            <uri-template>${data_set_c}
            </uri-template>
        </dataset>
        <dataset name="d" frequency="${coord:days(1)}"
            initial-instance="2009-01-01T01:00Z" timezone="UTC">
            <uri-template>${data_set_d}
            </uri-template>
            <done-flag></done-flag>
        </dataset>

        <dataset name="e" frequency="${coord:days(1)}"
            initial-instance="2009-01-01T01:00Z" timezone="UTC">
            <uri-template>${data_set_e}
            </uri-template>
        </dataset>

        <dataset name="local_a" frequency="${coord:days(1)}"
            initial-instance="2009-02-01T01:00Z" timezone="UTC">
            <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}
            </uri-template>
        </dataset>
    </datasets>
    <input-events>
        <data-in name="A" dataset="a">
            <instance>${coord:current(0)}</instance>
        </data-in>
        <data-in name="B" dataset="b">
            <start-instance>${coord:current(-5)}</start-instance>
            <end-instance>${coord:current(0)}</end-instance>
        </data-in>
        <data-in name="C" dataset="c">
            <start-instance>${coord:latest(-5)}</start-instance>
            <end-instance>${coord:latest(0)}</end-instance>
        </data-in>
        <data-in name="D" dataset="d">
            <instance>${coord:current(0)}</instance>
        </data-in>
        <data-in name="E" dataset="e">
            <start-instance>${coord:current(-5)}</start-instance>
            <end-instance>${coord:current(0)}</end-instance>
        </data-in>
        <data-in name="F" dataset="e">
            <instance>${coord:current(0)}</instance>
            <instance>${coord:latest(0)}</instance>
        </data-in>
    </input-events>
    <output-events>
        <data-out name="LOCAL_A" dataset="local_a">
            <instance>${coord:current(0)}</instance>
        </data-out>
    </output-events>
    <action>
        <workflow>
            <app-path>hdfs:///tmp/workflows/</app-path>
            <configuration>
                <property>
                    <name>inputA</name>
                    <value>${coord:dataIn('A')}</value>
                </property>
                <property>
                    <name>inputB</name>
                    <value>${coord:dataOut('LOCAL_A')}</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>
