You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluo.apache.org by kt...@apache.org on 2016/07/15 21:15:39 UTC

[1/3] incubator-fluo-recipes git commit: Fixes #50 - Rename Pirtos to TableOptimizations

Repository: incubator-fluo-recipes
Updated Branches:
  refs/heads/master f1dce1499 -> a8b85f332


Fixes #50 - Rename Pirtos to TableOptimizations


Project: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/commit/0ce1bc20
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/tree/0ce1bc20
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/diff/0ce1bc20

Branch: refs/heads/master
Commit: 0ce1bc20684ab383bb306f31e5435bb7100dd14a
Parents: f1dce14
Author: Mike Walch <mw...@gmail.com>
Authored: Thu Jul 14 10:49:28 2016 -0400
Committer: Mike Walch <mw...@gmail.com>
Committed: Thu Jul 14 10:49:28 2016 -0400

----------------------------------------------------------------------
 docs/row-hasher.md                              |  4 +-
 docs/table-optimization.md                      |  6 +-
 .../recipes/accumulo/cmds/OptimizeTable.java    |  5 +-
 .../recipes/accumulo/ops/TableOperations.java   | 14 ++--
 .../org/apache/fluo/recipes/common/Pirtos.java  | 83 --------------------
 .../fluo/recipes/common/TableOptimizations.java | 82 +++++++++++++++++++
 .../org/apache/fluo/recipes/data/RowHasher.java | 12 +--
 .../apache/fluo/recipes/export/ExportQueue.java | 21 ++---
 .../fluo/recipes/map/CollisionFreeMap.java      | 20 ++---
 .../fluo/recipes/common/TestGrouping.java       | 25 +++---
 .../org/apache/fluo/recipes/map/SplitsTest.java | 15 ++--
 .../fluo/recipes/test/AccumuloExportITBase.java |  5 +-
 12 files changed, 149 insertions(+), 143 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/docs/row-hasher.md
----------------------------------------------------------------------
diff --git a/docs/row-hasher.md b/docs/row-hasher.md
index adb423f..78aab23 100644
--- a/docs/row-hasher.md
+++ b/docs/row-hasher.md
@@ -31,7 +31,7 @@ balancing of the prefix.
 
 ```java
 import org.apache.fluo.api.data.Bytes;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 import org.apache.fluo.recipes.data.RowHasher;
 
 public class RowHasherExample {
@@ -60,7 +60,7 @@ public class RowHasherExample {
     // Generate table optimizations for the recipe. This can be called when setting up an
     // application that uses a hashed row.
     int numTablets = 20;
-    Pirtos tableOptimizations = pageRowHasher.getTableOptimizations(numTablets);
+    TableOptimizations tableOptimizations = pageRowHasher.getTableOptimizations(numTablets);
     System.out.println("Balance config : " + tableOptimizations.getTabletGroupingRegex());
     System.out.println("Splits         : ");
     tableOptimizations.getSplits().forEach(System.out::println);

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/docs/table-optimization.md
----------------------------------------------------------------------
diff --git a/docs/table-optimization.md b/docs/table-optimization.md
index a194b5e..068f586 100644
--- a/docs/table-optimization.md
+++ b/docs/table-optimization.md
@@ -24,7 +24,7 @@ CollisionFreeMap.configure(fluoConf, ...);
 FluoFactory.newAdmin(fluoConf).initialize(...)
 
 //Automatically optimize the Fluo table for all configured recipes
-Pirtos tableOptimizations = getConfiguredOptimizations(fluoConf);
+TableOptimizations tableOptimizations = getConfiguredOptimizations(fluoConf);
 TableOperations.optimizeTable(fluoConf, tableOptimizations);
 ```
 
@@ -33,8 +33,8 @@ selective optimizations is need look into using the following methods instead.
 
  * `CollisionFreeMap.getTableOptimizations(String mapId, Configuration appConfig)`
  * `ExportQueue.getTableOptimizations(String queueId, Configuration appConfig)`
- * `TableOperations.optimizeTable(FluoConfiguration fluoConfig, Pirtos pirtos)`
- * `Pirtos.merge()`
+ * `TableOperations.optimizeTable(FluoConfiguration fluoConfig, TableOptimizations tableOptim)`
+ * `TableOptimizations.merge()`
 
 ## Command Example
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/cmds/OptimizeTable.java
----------------------------------------------------------------------
diff --git a/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/cmds/OptimizeTable.java b/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/cmds/OptimizeTable.java
index 6b5276b..7910bdb 100644
--- a/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/cmds/OptimizeTable.java
+++ b/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/cmds/OptimizeTable.java
@@ -19,7 +19,7 @@ import javax.inject.Inject;
 
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.recipes.accumulo.ops.TableOperations;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 
 public class OptimizeTable {
 
@@ -34,7 +34,8 @@ public class OptimizeTable {
     }
 
 
-    TableOperations.optimizeTable(fluoConfig, Pirtos.getConfiguredOptimizations(fluoConfig));
+    TableOperations.optimizeTable(fluoConfig,
+        TableOptimizations.getConfiguredOptimizations(fluoConfig));
     System.out.println("Finished optimizing table");
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/ops/TableOperations.java
----------------------------------------------------------------------
diff --git a/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/ops/TableOperations.java b/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/ops/TableOperations.java
index e521014..c4fd07f 100644
--- a/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/ops/TableOperations.java
+++ b/modules/accumulo/src/main/java/org/apache/fluo/recipes/accumulo/ops/TableOperations.java
@@ -28,7 +28,7 @@ import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Bytes;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 import org.apache.fluo.recipes.common.RowRange;
 import org.apache.fluo.recipes.common.TransientRegistry;
 import org.apache.hadoop.io.Text;
@@ -64,28 +64,30 @@ public class TableOperations {
   /**
    * This method will perform all post initialization recommended actions.
    */
-  public static void optimizeTable(FluoConfiguration fluoConfig, Pirtos pirtos) throws Exception {
+  public static void optimizeTable(FluoConfiguration fluoConfig, TableOptimizations tableOptim)
+      throws Exception {
 
     Connector conn = getConnector(fluoConfig);
 
     TreeSet<Text> splits = new TreeSet<>();
 
-    for (Bytes split : pirtos.getSplits()) {
+    for (Bytes split : tableOptim.getSplits()) {
       splits.add(new Text(split.toArray()));
     }
 
     String table = fluoConfig.getAccumuloTable();
     conn.tableOperations().addSplits(table, splits);
 
-    if (pirtos.getTabletGroupingRegex() != null && !pirtos.getTabletGroupingRegex().isEmpty()) {
+    if (tableOptim.getTabletGroupingRegex() != null
+        && !tableOptim.getTabletGroupingRegex().isEmpty()) {
       // was going to call :
       // conn.instanceOperations().testClassLoad(RGB_CLASS, TABLET_BALANCER_CLASS)
       // but that failed. See ACCUMULO-4068
 
       try {
         // setting this prop first intentionally because it should fail in 1.6
-        conn.tableOperations()
-            .setProperty(table, RGB_PATTERN_PROP, pirtos.getTabletGroupingRegex());
+        conn.tableOperations().setProperty(table, RGB_PATTERN_PROP,
+            tableOptim.getTabletGroupingRegex());
         conn.tableOperations().setProperty(table, RGB_DEFAULT_PROP, "none");
         conn.tableOperations().setProperty(table, TABLE_BALANCER_PROP, RGB_CLASS);
       } catch (AccumuloException e) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/main/java/org/apache/fluo/recipes/common/Pirtos.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/recipes/common/Pirtos.java b/modules/core/src/main/java/org/apache/fluo/recipes/common/Pirtos.java
deleted file mode 100644
index bdb9e60..0000000
--- a/modules/core/src/main/java/org/apache/fluo/recipes/common/Pirtos.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.fluo.recipes.common;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-import org.apache.fluo.api.client.FluoClient;
-import org.apache.fluo.api.client.FluoFactory;
-import org.apache.fluo.api.config.FluoConfiguration;
-import org.apache.fluo.api.config.SimpleConfiguration;
-import org.apache.fluo.api.data.Bytes;
-import org.apache.fluo.recipes.export.ExportQueue;
-import org.apache.fluo.recipes.map.CollisionFreeMap;
-
-/**
- * Post initialization recommended table optimizations.
- */
-
-public class Pirtos {
-  private List<Bytes> splits = new ArrayList<>();
-  private String tabletGroupingRegex = "";
-
-  public void setSplits(List<Bytes> splits) {
-    this.splits.clear();
-    this.splits.addAll(splits);
-  }
-
-  /**
-   * @return A recommended set of splits points to add to a Fluo table after initialization.
-   */
-  public List<Bytes> getSplits() {
-    return Collections.unmodifiableList(splits);
-  }
-
-  public void setTabletGroupingRegex(String tgr) {
-    Objects.requireNonNull(tgr);
-    this.tabletGroupingRegex = tgr;
-  }
-
-  public String getTabletGroupingRegex() {
-    return "(" + tabletGroupingRegex + ").*";
-  }
-
-  public void merge(Pirtos other) {
-    splits.addAll(other.splits);
-    if (tabletGroupingRegex.length() > 0 && other.tabletGroupingRegex.length() > 0) {
-      tabletGroupingRegex += "|" + other.tabletGroupingRegex;
-    } else {
-      tabletGroupingRegex += other.tabletGroupingRegex;
-    }
-  }
-
-  /**
-   * A utility method to get table optimizations for all configured recipes.
-   */
-  public static Pirtos getConfiguredOptimizations(FluoConfiguration fluoConfig) {
-    try (FluoClient client = FluoFactory.newClient(fluoConfig)) {
-      SimpleConfiguration appConfig = client.getAppConfiguration();
-      Pirtos pirtos = new Pirtos();
-
-      pirtos.merge(ExportQueue.getTableOptimizations(appConfig));
-      pirtos.merge(CollisionFreeMap.getTableOptimizations(appConfig));
-
-      return pirtos;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/main/java/org/apache/fluo/recipes/common/TableOptimizations.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/recipes/common/TableOptimizations.java b/modules/core/src/main/java/org/apache/fluo/recipes/common/TableOptimizations.java
new file mode 100644
index 0000000..7884450
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/fluo/recipes/common/TableOptimizations.java
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+
+package org.apache.fluo.recipes.common;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+import org.apache.fluo.api.client.FluoClient;
+import org.apache.fluo.api.client.FluoFactory;
+import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
+import org.apache.fluo.api.data.Bytes;
+import org.apache.fluo.recipes.export.ExportQueue;
+import org.apache.fluo.recipes.map.CollisionFreeMap;
+
+/**
+ * Post initialization recommended table optimizations.
+ */
+public class TableOptimizations {
+  private List<Bytes> splits = new ArrayList<>();
+  private String tabletGroupingRegex = "";
+
+  public void setSplits(List<Bytes> splits) {
+    this.splits.clear();
+    this.splits.addAll(splits);
+  }
+
+  /**
+   * @return A recommended set of splits points to add to a Fluo table after initialization.
+   */
+  public List<Bytes> getSplits() {
+    return Collections.unmodifiableList(splits);
+  }
+
+  public void setTabletGroupingRegex(String tgr) {
+    Objects.requireNonNull(tgr);
+    this.tabletGroupingRegex = tgr;
+  }
+
+  public String getTabletGroupingRegex() {
+    return "(" + tabletGroupingRegex + ").*";
+  }
+
+  public void merge(TableOptimizations other) {
+    splits.addAll(other.splits);
+    if (tabletGroupingRegex.length() > 0 && other.tabletGroupingRegex.length() > 0) {
+      tabletGroupingRegex += "|" + other.tabletGroupingRegex;
+    } else {
+      tabletGroupingRegex += other.tabletGroupingRegex;
+    }
+  }
+
+  /**
+   * A utility method to get table optimizations for all configured recipes.
+   */
+  public static TableOptimizations getConfiguredOptimizations(FluoConfiguration fluoConfig) {
+    try (FluoClient client = FluoFactory.newClient(fluoConfig)) {
+      SimpleConfiguration appConfig = client.getAppConfiguration();
+      TableOptimizations tableOptim = new TableOptimizations();
+
+      tableOptim.merge(ExportQueue.getTableOptimizations(appConfig));
+      tableOptim.merge(CollisionFreeMap.getTableOptimizations(appConfig));
+
+      return tableOptim;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/main/java/org/apache/fluo/recipes/data/RowHasher.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/recipes/data/RowHasher.java b/modules/core/src/main/java/org/apache/fluo/recipes/data/RowHasher.java
index 2501fa1..7b027b2 100644
--- a/modules/core/src/main/java/org/apache/fluo/recipes/data/RowHasher.java
+++ b/modules/core/src/main/java/org/apache/fluo/recipes/data/RowHasher.java
@@ -24,7 +24,7 @@ import com.google.common.base.Strings;
 import com.google.common.hash.Hashing;
 import org.apache.fluo.api.data.Bytes;
 import org.apache.fluo.api.data.BytesBuilder;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 
 /**
  * This recipe provides code to help add a hash of the row as a prefix of the row. Using this recipe
@@ -44,7 +44,7 @@ public class RowHasher {
 
   private static final int HASH_LEN = 4;
 
-  public Pirtos getTableOptimizations(int numTablets) {
+  public TableOptimizations getTableOptimizations(int numTablets) {
 
     List<Bytes> splits = new ArrayList<>(numTablets - 1);
 
@@ -60,11 +60,11 @@ public class RowHasher {
     splits.add(Bytes.of(prefix + "~"));
 
 
-    Pirtos pirtos = new Pirtos();
-    pirtos.setSplits(splits);
-    pirtos.setTabletGroupingRegex(Pattern.quote(prefix.toString()));
+    TableOptimizations tableOptim = new TableOptimizations();
+    tableOptim.setSplits(splits);
+    tableOptim.setTabletGroupingRegex(Pattern.quote(prefix.toString()));
 
-    return pirtos;
+    return tableOptim;
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/main/java/org/apache/fluo/recipes/export/ExportQueue.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/recipes/export/ExportQueue.java b/modules/core/src/main/java/org/apache/fluo/recipes/export/ExportQueue.java
index 13518e7..8528fdf 100644
--- a/modules/core/src/main/java/org/apache/fluo/recipes/export/ExportQueue.java
+++ b/modules/core/src/main/java/org/apache/fluo/recipes/export/ExportQueue.java
@@ -30,7 +30,7 @@ import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.config.ObserverConfiguration;
 import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Bytes;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 import org.apache.fluo.recipes.common.RowRange;
 import org.apache.fluo.recipes.common.TransientRegistry;
 import org.apache.fluo.recipes.serialization.SimpleSerializer;
@@ -120,15 +120,15 @@ public class ExportQueue<K, V> {
    *        {@code FluoConfiguration.getAppConfiguration()}
    */
 
-  public static Pirtos getTableOptimizations(SimpleConfiguration appConfig) {
+  public static TableOptimizations getTableOptimizations(SimpleConfiguration appConfig) {
     HashSet<String> queueIds = new HashSet<>();
     appConfig.getKeys(Options.PREFIX.substring(0, Options.PREFIX.length() - 1)).forEachRemaining(
         k -> queueIds.add(k.substring(Options.PREFIX.length()).split("\\.", 2)[0]));
 
-    Pirtos pirtos = new Pirtos();
-    queueIds.forEach(qid -> pirtos.merge(getTableOptimizations(qid, appConfig)));
+    TableOptimizations tableOptim = new TableOptimizations();
+    queueIds.forEach(qid -> tableOptim.merge(getTableOptimizations(qid, appConfig)));
 
-    return pirtos;
+    return tableOptim;
   }
 
   /**
@@ -138,7 +138,8 @@ public class ExportQueue<K, V> {
    *        {@code FluoClient.getAppConfiguration()} or
    *        {@code FluoConfiguration.getAppConfiguration()}
    */
-  public static Pirtos getTableOptimizations(String queueId, SimpleConfiguration appConfig) {
+  public static TableOptimizations getTableOptimizations(String queueId,
+      SimpleConfiguration appConfig) {
     Options opts = new Options(queueId, appConfig);
 
     List<Bytes> splits = new ArrayList<>();
@@ -156,14 +157,14 @@ public class ExportQueue<K, V> {
     Collections.sort(exportSplits);
     splits.addAll(exportSplits);
 
-    Pirtos pirtos = new Pirtos();
-    pirtos.setSplits(splits);
+    TableOptimizations tableOptim = new TableOptimizations();
+    tableOptim.setSplits(splits);
 
     // the tablet with end row <queueId># does not contain any data for the export queue and
     // should not be grouped with the export queue
-    pirtos.setTabletGroupingRegex(Pattern.quote(queueId + ":"));
+    tableOptim.setTabletGroupingRegex(Pattern.quote(queueId + ":"));
 
-    return pirtos;
+    return tableOptim;
   }
 
   public static class Options {

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/main/java/org/apache/fluo/recipes/map/CollisionFreeMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/recipes/map/CollisionFreeMap.java b/modules/core/src/main/java/org/apache/fluo/recipes/map/CollisionFreeMap.java
index bc7bffd..06c5280 100644
--- a/modules/core/src/main/java/org/apache/fluo/recipes/map/CollisionFreeMap.java
+++ b/modules/core/src/main/java/org/apache/fluo/recipes/map/CollisionFreeMap.java
@@ -47,7 +47,7 @@ import org.apache.fluo.api.data.RowColumnValue;
 import org.apache.fluo.api.data.Span;
 import org.apache.fluo.api.iterator.ColumnIterator;
 import org.apache.fluo.api.iterator.RowIterator;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 import org.apache.fluo.recipes.common.RowRange;
 import org.apache.fluo.recipes.common.TransientRegistry;
 import org.apache.fluo.recipes.impl.BucketUtil;
@@ -585,15 +585,15 @@ public class CollisionFreeMap<K, V> {
    *        {@code FluoClient.getAppConfiguration()} or
    *        {@code FluoConfiguration.getAppConfiguration()}
    */
-  public static Pirtos getTableOptimizations(SimpleConfiguration appConfig) {
+  public static TableOptimizations getTableOptimizations(SimpleConfiguration appConfig) {
     HashSet<String> mapIds = new HashSet<>();
     appConfig.getKeys(Options.PREFIX.substring(0, Options.PREFIX.length() - 1)).forEachRemaining(
         k -> mapIds.add(k.substring(Options.PREFIX.length()).split("\\.", 2)[0]));
 
-    Pirtos pirtos = new Pirtos();
-    mapIds.forEach(mid -> pirtos.merge(getTableOptimizations(mid, appConfig)));
+    TableOptimizations tableOptim = new TableOptimizations();
+    mapIds.forEach(mid -> tableOptim.merge(getTableOptimizations(mid, appConfig)));
 
-    return pirtos;
+    return tableOptim;
   }
 
   /**
@@ -603,7 +603,7 @@ public class CollisionFreeMap<K, V> {
    *        {@code FluoClient.getAppConfiguration()} or
    *        {@code FluoConfiguration.getAppConfiguration()}
    */
-  public static Pirtos getTableOptimizations(String mapId, SimpleConfiguration appConfig) {
+  public static TableOptimizations getTableOptimizations(String mapId, SimpleConfiguration appConfig) {
     Options opts = new Options(mapId, appConfig);
 
     BytesBuilder rowBuilder = Bytes.newBuilder();
@@ -634,12 +634,12 @@ public class CollisionFreeMap<K, V> {
     splits.addAll(dataSplits);
     splits.addAll(updateSplits);
 
-    Pirtos pirtos = new Pirtos();
-    pirtos.setSplits(splits);
+    TableOptimizations tableOptim = new TableOptimizations();
+    tableOptim.setSplits(splits);
 
-    pirtos.setTabletGroupingRegex(Pattern.quote(mapId + ":") + "[du]:");
+    tableOptim.setTabletGroupingRegex(Pattern.quote(mapId + ":") + "[du]:");
 
-    return pirtos;
+    return tableOptim;
   }
 
   private static byte[] encSeq(long l) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/test/java/org/apache/fluo/recipes/common/TestGrouping.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/fluo/recipes/common/TestGrouping.java b/modules/core/src/test/java/org/apache/fluo/recipes/common/TestGrouping.java
index 8bf338c..b660610 100644
--- a/modules/core/src/test/java/org/apache/fluo/recipes/common/TestGrouping.java
+++ b/modules/core/src/test/java/org/apache/fluo/recipes/common/TestGrouping.java
@@ -41,10 +41,11 @@ public class TestGrouping {
     ExportQueue.configure(conf, new org.apache.fluo.recipes.export.ExportQueue.Options("eq2", "et",
         "kt", "vt", 3));
 
-    Pirtos pirtos = CollisionFreeMap.getTableOptimizations(conf.getAppConfiguration());
-    pirtos.merge(ExportQueue.getTableOptimizations(conf.getAppConfiguration()));
+    TableOptimizations tableOptim =
+        CollisionFreeMap.getTableOptimizations(conf.getAppConfiguration());
+    tableOptim.merge(ExportQueue.getTableOptimizations(conf.getAppConfiguration()));
 
-    Pattern pattern = Pattern.compile(pirtos.getTabletGroupingRegex());
+    Pattern pattern = Pattern.compile(tableOptim.getTabletGroupingRegex());
 
     Assert.assertEquals("m1:u:", group(pattern, "m1:u:f0c"));
     Assert.assertEquals("m1:d:", group(pattern, "m1:d:f0c"));
@@ -57,20 +58,20 @@ public class TestGrouping {
     Assert.assertEquals("none", group(pattern, "eq3:f0c"));
 
     // validate the assumptions this test is making
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("eq1#")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("eq2#")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("eq1:~")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("eq2:~")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("m1:u:~")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("m1:d:~")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("m2:u:~")));
-    Assert.assertTrue(pirtos.getSplits().contains(Bytes.of("m2:d:~")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("eq1#")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("eq2#")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("eq1:~")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("eq2:~")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("m1:u:~")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("m1:d:~")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("m2:u:~")));
+    Assert.assertTrue(tableOptim.getSplits().contains(Bytes.of("m2:d:~")));
 
     Set<String> expectedGroups =
         ImmutableSet.of("m1:u:", "m1:d:", "m2:u:", "m2:d:", "eq1:", "eq2:");
 
     // ensure all splits group as expected
-    for (Bytes split : pirtos.getSplits()) {
+    for (Bytes split : tableOptim.getSplits()) {
       String g = group(pattern, split.toString());
 
       if (expectedGroups.contains(g)) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/core/src/test/java/org/apache/fluo/recipes/map/SplitsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/fluo/recipes/map/SplitsTest.java b/modules/core/src/test/java/org/apache/fluo/recipes/map/SplitsTest.java
index a81e721..96b07cb 100644
--- a/modules/core/src/test/java/org/apache/fluo/recipes/map/SplitsTest.java
+++ b/modules/core/src/test/java/org/apache/fluo/recipes/map/SplitsTest.java
@@ -23,7 +23,7 @@ import java.util.List;
 import com.google.common.collect.Lists;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.data.Bytes;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 import org.apache.fluo.recipes.map.CollisionFreeMap.Options;
 import org.junit.Assert;
 import org.junit.Test;
@@ -43,33 +43,34 @@ public class SplitsTest {
     FluoConfiguration fluoConfig = new FluoConfiguration();
     CollisionFreeMap.configure(fluoConfig, opts);
 
-    Pirtos pirtos1 =
+    TableOptimizations tableOptim1 =
         CollisionFreeMap.getTableOptimizations("foo", fluoConfig.getAppConfiguration());
     List<Bytes> expected1 =
         Lists.transform(
             Arrays.asList("foo:d:1", "foo:d:2", "foo:d:~", "foo:u:1", "foo:u:2", "foo:u:~"),
             Bytes::of);
 
-    Assert.assertEquals(expected1, sort(pirtos1.getSplits()));
+    Assert.assertEquals(expected1, sort(tableOptim1.getSplits()));
 
     Options opts2 = new Options("bar", WordCountCombiner.class, String.class, Long.class, 6);
     opts2.setBucketsPerTablet(2);
     CollisionFreeMap.configure(fluoConfig, opts2);
 
-    Pirtos pirtos2 =
+    TableOptimizations tableOptim2 =
         CollisionFreeMap.getTableOptimizations("bar", fluoConfig.getAppConfiguration());
     List<Bytes> expected2 =
         Lists.transform(
             Arrays.asList("bar:d:2", "bar:d:4", "bar:d:~", "bar:u:2", "bar:u:4", "bar:u:~"),
             Bytes::of);
-    Assert.assertEquals(expected2, sort(pirtos2.getSplits()));
+    Assert.assertEquals(expected2, sort(tableOptim2.getSplits()));
 
-    Pirtos pirtos3 = CollisionFreeMap.getTableOptimizations(fluoConfig.getAppConfiguration());
+    TableOptimizations tableOptim3 =
+        CollisionFreeMap.getTableOptimizations(fluoConfig.getAppConfiguration());
 
     ArrayList<Bytes> expected3 = new ArrayList<>(expected2);
     expected3.addAll(expected1);
 
-    Assert.assertEquals(expected3, sort(pirtos3.getSplits()));
+    Assert.assertEquals(expected3, sort(tableOptim3.getSplits()));
 
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/0ce1bc20/modules/test/src/main/java/org/apache/fluo/recipes/test/AccumuloExportITBase.java
----------------------------------------------------------------------
diff --git a/modules/test/src/main/java/org/apache/fluo/recipes/test/AccumuloExportITBase.java b/modules/test/src/main/java/org/apache/fluo/recipes/test/AccumuloExportITBase.java
index b640751..07cff67 100644
--- a/modules/test/src/main/java/org/apache/fluo/recipes/test/AccumuloExportITBase.java
+++ b/modules/test/src/main/java/org/apache/fluo/recipes/test/AccumuloExportITBase.java
@@ -31,7 +31,7 @@ import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.mini.MiniFluo;
 import org.apache.fluo.recipes.accumulo.ops.TableOperations;
-import org.apache.fluo.recipes.common.Pirtos;
+import org.apache.fluo.recipes.common.TableOptimizations;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -180,7 +180,8 @@ public class AccumuloExportITBase {
    */
   protected void postFluoInitHook() throws Exception {
     // TODO maybe remove
-    TableOperations.optimizeTable(fluoConfig, Pirtos.getConfiguredOptimizations(fluoConfig));
+    TableOperations.optimizeTable(fluoConfig,
+        TableOptimizations.getConfiguredOptimizations(fluoConfig));
   }
 
   /**


[3/3] incubator-fluo-recipes git commit: Merge remote-tracking branch 'mike/fr-50'

Posted by kt...@apache.org.
Merge remote-tracking branch 'mike/fr-50'


Project: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/commit/a8b85f33
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/tree/a8b85f33
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/diff/a8b85f33

Branch: refs/heads/master
Commit: a8b85f33288e32b73b6c042305f1cf065195b863
Parents: 9bafe1a 0ce1bc2
Author: Keith Turner <kt...@apache.org>
Authored: Fri Jul 15 17:05:40 2016 -0400
Committer: Keith Turner <kt...@apache.org>
Committed: Fri Jul 15 17:05:40 2016 -0400

----------------------------------------------------------------------
 docs/row-hasher.md                              |  4 +-
 docs/table-optimization.md                      |  6 +-
 .../recipes/accumulo/cmds/OptimizeTable.java    |  5 +-
 .../recipes/accumulo/ops/TableOperations.java   | 14 ++--
 .../org/apache/fluo/recipes/common/Pirtos.java  | 83 --------------------
 .../fluo/recipes/common/TableOptimizations.java | 82 +++++++++++++++++++
 .../org/apache/fluo/recipes/data/RowHasher.java | 12 +--
 .../apache/fluo/recipes/export/ExportQueue.java | 21 ++---
 .../fluo/recipes/map/CollisionFreeMap.java      | 20 ++---
 .../fluo/recipes/common/TestGrouping.java       | 25 +++---
 .../org/apache/fluo/recipes/map/SplitsTest.java | 15 ++--
 .../fluo/recipes/test/AccumuloExportITBase.java |  5 +-
 12 files changed, 149 insertions(+), 143 deletions(-)
----------------------------------------------------------------------



[2/3] incubator-fluo-recipes git commit: Update whitespace in LICENSE file

Posted by kt...@apache.org.
Update whitespace in LICENSE file


Project: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/commit/9bafe1a1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/tree/9bafe1a1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/diff/9bafe1a1

Branch: refs/heads/master
Commit: 9bafe1a1e371ae6d8af45a5307c1333baf9981a2
Parents: f1dce14
Author: Mike Walch <mw...@gmail.com>
Authored: Fri Jul 15 13:34:03 2016 -0400
Committer: Mike Walch <mw...@gmail.com>
Committed: Fri Jul 15 13:34:03 2016 -0400

----------------------------------------------------------------------
 LICENSE | 367 ++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 189 insertions(+), 178 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fluo-recipes/blob/9bafe1a1/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index 37ec93a..d645695 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,180 +1,191 @@
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and
-distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright
-owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities
-that control, are controlled by, or are under common control with that entity.
-For the purposes of this definition, "control" means (i) the power, direct or
-indirect, to cause the direction or management of such entity, whether by
-contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
-outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising
-permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including
-but not limited to software source code, documentation source, and configuration
-files.
-
-"Object" form shall mean any form resulting from mechanical transformation or
-translation of a Source form, including but not limited to compiled object code,
-generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made
-available under the License, as indicated by a copyright notice that is included
-in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that
-is based on (or derived from) the Work and for which the editorial revisions,
-annotations, elaborations, or other modifications represent, as a whole, an
-original work of authorship. For the purposes of this License, Derivative Works
-shall not include works that remain separable from, or merely link (or bind by
-name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version
-of the Work and any modifications or additions to that Work or Derivative Works
-thereof, that is intentionally submitted to Licensor for inclusion in the Work
-by the copyright owner or by an individual or Legal Entity authorized to submit
-on behalf of the copyright owner. For the purposes of this definition,
-"submitted" means any form of electronic, verbal, or written communication sent
-to the Licensor or its representatives, including but not limited to
-communication on electronic mailing lists, source code control systems, and
-issue tracking systems that are managed by, or on behalf of, the Licensor for
-the purpose of discussing and improving the Work, but excluding communication
-that is conspicuously marked or otherwise designated in writing by the copyright
-owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
-of whom a Contribution has been received by Licensor and subsequently
-incorporated within the Work.
-
-2. Grant of Copyright License.
-
-Subject to the terms and conditions of this License, each Contributor hereby
-grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
-irrevocable copyright license to reproduce, prepare Derivative Works of,
-publicly display, publicly perform, sublicense, and distribute the Work and such
-Derivative Works in Source or Object form.
-
-3. Grant of Patent License.
-
-Subject to the terms and conditions of this License, each Contributor hereby
-grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
-irrevocable (except as stated in this section) patent license to make, have
-made, use, offer to sell, sell, import, and otherwise transfer the Work, where
-such license applies only to those patent claims licensable by such Contributor
-that are necessarily infringed by their Contribution(s) alone or by combination
-of their Contribution(s) with the Work to which such Contribution(s) was
-submitted. If You institute patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that the Work or a
-Contribution incorporated within the Work constitutes direct or contributory
-patent infringement, then any patent licenses granted to You under this License
-for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution.
-
-You may reproduce and distribute copies of the Work or Derivative Works thereof
-in any medium, with or without modifications, and in Source or Object form,
-provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of
-this License; and
-You must cause any modified files to carry prominent notices stating that You
-changed the files; and
-You must retain, in the Source form of any Derivative Works that You distribute,
-all copyright, patent, trademark, and attribution notices from the Source form
-of the Work, excluding those notices that do not pertain to any part of the
-Derivative Works; and
-If the Work includes a "NOTICE" text file as part of its distribution, then any
-Derivative Works that You distribute must include a readable copy of the
-attribution notices contained within such NOTICE file, excluding those notices
-that do not pertain to any part of the Derivative Works, in at least one of the
-following places: within a NOTICE text file distributed as part of the
-Derivative Works; within the Source form or documentation, if provided along
-with the Derivative Works; or, within a display generated by the Derivative
-Works, if and wherever such third-party notices normally appear. The contents of
-the NOTICE file are for informational purposes only and do not modify the
-License. You may add Your own attribution notices within Derivative Works that
-You distribute, alongside or as an addendum to the NOTICE text from the Work,
-provided that such additional attribution notices cannot be construed as
-modifying the License.
-You may add Your own copyright statement to Your modifications and may provide
-additional or different license terms and conditions for use, reproduction, or
-distribution of Your modifications, or for any such Derivative Works as a whole,
-provided Your use, reproduction, and distribution of the Work otherwise complies
-with the conditions stated in this License.
-
-5. Submission of Contributions.
-
-Unless You explicitly state otherwise, any Contribution intentionally submitted
-for inclusion in the Work by You to the Licensor shall be under the terms and
-conditions of this License, without any additional terms or conditions.
-Notwithstanding the above, nothing herein shall supersede or modify the terms of
-any separate license agreement you may have executed with Licensor regarding
-such Contributions.
-
-6. Trademarks.
-
-This License does not grant permission to use the trade names, trademarks,
-service marks, or product names of the Licensor, except as required for
-reasonable and customary use in describing the origin of the Work and
-reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty.
-
-Unless required by applicable law or agreed to in writing, Licensor provides the
-Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
-including, without limitation, any warranties or conditions of TITLE,
-NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
-solely responsible for determining the appropriateness of using or
-redistributing the Work and assume any risks associated with Your exercise of
-permissions under this License.
-
-8. Limitation of Liability.
-
-In no event and under no legal theory, whether in tort (including negligence),
-contract, or otherwise, unless required by applicable law (such as deliberate
-and grossly negligent acts) or agreed to in writing, shall any Contributor be
-liable to You for damages, including any direct, indirect, special, incidental,
-or consequential damages of any character arising as a result of this License or
-out of the use or inability to use the Work (including but not limited to
-damages for loss of goodwill, work stoppage, computer failure or malfunction, or
-any and all other commercial damages or losses), even if such Contributor has
-been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability.
-
-While redistributing the Work or Derivative Works thereof, You may choose to
-offer, and charge a fee for, acceptance of support, warranty, indemnity, or
-other liability obligations and/or rights consistent with this License. However,
-in accepting such obligations, You may act only on Your own behalf and on Your
-sole responsibility, not on behalf of any other Contributor, and only if You
-agree to indemnify, defend, and hold each Contributor harmless for any liability
-incurred by, or claims asserted against, such Contributor by reason of your
-accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work
-
-To apply the Apache License to your work, attach the following boilerplate
-notice, with the fields enclosed by brackets "[]" replaced with your own
-identifying information. (Don't include the brackets!) The text should be
-enclosed in the appropriate comment syntax for the file format. We also
-recommend that a file or class name and description of purpose be included on
-the same "printed page" as the copyright notice for easier identification within
-third-party archives.
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
 
    Copyright [yyyy] [name of copyright owner]
 
@@ -182,7 +193,7 @@ third-party archives.
    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
+       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,