/**
* 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.
*/
digraph bigpetstore {

   node [shape=record];


   DIRTY_CSV [label="Raw, dirty data in CSV format"];
   STRUCTURED_DATA [label="Data model serialized as sequence files"];
   generator [label="Data Generator (generator.SparkDriver)"];
   ETL [label="Extract-Transform-Load (etl.SparkETL)"];
   SalesAnalytics [label="Sales Analytics (analytics.Sales)"];
   SalesTables [label="Sales Trends Tables (CSV)"];
   CustomerAnalytics [label="Customer Analytics (analytics.Customers)"];
   CustomerTables [label="Customer Trends Tables (CSV)"];
   ItemRecommender [label="Item Recommendor (analytics.ItemRecommendor)"];
   ItemRecommendations [label="Customer Product Recommendations (CSV)"];

   generator -> DIRTY_CSV -> ETL -> STRUCTURED_DATA;
   STRUCTURED_DATA -> SalesAnalytics -> SalesTables;
   STRUCTURED_DATA -> CustomerAnalytics -> CustomerTables;
   STRUCTURED_DATA -> ItemRecommender -> ItemRecommendations;
}
