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,