<!--
  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.2' name='NAME'
frequency="1" start='2009-02-01T01:00Z' end='2009-02-03T23:59Z'
timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
    <controls>
        <timeout>10</timeout>
        <concurrency>2</concurrency>
        <execution>LIFO</execution>
    </controls>
    <input-events>
        <data-in name='A' dataset='a'>
        <dataset name='a' frequency='7' initial-instance='2009-01-01T01:00Z'
            timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
            <uri-template>hcat://dummyhcat:1000/db1/table1/ds=${YEAR}-${DAY}
            </uri-template>
        </dataset>
        <instance>${coord:current(-3)}</instance>
        </data-in>

        <data-in name='B' dataset='b'>
        <dataset name='b' frequency='7' initial-instance='2009-01-01T01:00Z'
            timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
            <uri-template>hcat://dummyhcat:1000/db2/table2/ds=${YEAR}-${DAY}
            </uri-template>
        </dataset>
        <start-instance>${coord:latest(-1)}</start-instance>
        <end-instance>${coord:latest(0)}</end-instance>
        </data-in>
        <data-in name='C' dataset='c'>
        <dataset name='c' frequency='7' initial-instance='2009-01-01T01:00Z'
            timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
            <uri-template>hcat://dummyhcat:1000/db3/table3/ds=${YEAR}-${DAY}
            </uri-template>
        </dataset>
        <start-instance>${coord:current(-1)}</start-instance>
        <end-instance>${coord:current(0)}</end-instance>
        </data-in>

        <data-in name='D' dataset='d'>
        <dataset name='d' frequency='7' initial-instance='2009-01-01T01:00Z'
            timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>
            <uri-template>file://dummyhdfs/${YEAR}/${DAY}
            </uri-template>
        </dataset>
        <instance>${coord:current(0)}</instance>
        </data-in>
        </input-events>

        <action>
            <workflow>
                <app-path>hdfs:///tmp/workflows/</app-path>
                <configuration>
                    <property>
                        <name>inputA</name>
                        <value>${coord:dataIn('A')}</value>
                    </property>
                </configuration>
            </workflow>
        </action>
</coordinator-app>
