fluo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mwa...@apache.org
Subject [8/8] incubator-fluo-website git commit: Jekyll build from gh-pages:887634d
Date Fri, 28 Oct 2016 16:57:45 GMT
Jekyll build from gh-pages:887634d

Merge branch 'recipes-1.0.0-incubating' into gh-pages


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

Branch: refs/heads/asf-site
Commit: f6125fa246d864463e7e6ab2c3fb2b77f26bd21b
Parents: 90818a6
Author: Mike Walch <mwalch@apache.org>
Authored: Fri Oct 28 12:55:19 2016 -0400
Committer: Mike Walch <mwalch@apache.org>
Committed: Fri Oct 28 12:55:19 2016 -0400

----------------------------------------------------------------------
 README.md                                       |   2 +-
 api/archive/index.html                          |   4 +-
 api/index.html                                  |   2 +-
 docs/fluo-recipes/1.0.0-beta-1/cfm/index.html   |   2 +-
 .../1.0.0-beta-1/export-queue/index.html        |   2 +-
 docs/fluo-recipes/1.0.0-beta-1/index.html       |   2 +-
 .../1.0.0-beta-1/recording-tx/index.html        |   2 +-
 .../1.0.0-beta-1/serialization/index.html       |   2 +-
 .../1.0.0-beta-1/table-optimization/index.html  |   2 +-
 .../1.0.0-beta-1/transient/index.html           |   2 +-
 .../1.0.0-beta-2/accumulo-export/index.html     |   2 +
 docs/fluo-recipes/1.0.0-beta-2/cfm/index.html   |   2 +
 .../1.0.0-beta-2/export-queue/index.html        |   2 +
 docs/fluo-recipes/1.0.0-beta-2/index.html       |   2 +
 .../1.0.0-beta-2/recording-tx/index.html        |   2 +
 .../1.0.0-beta-2/row-hasher/index.html          |   2 +
 .../1.0.0-beta-2/serialization/index.html       |   2 +
 .../1.0.0-beta-2/table-optimization/index.html  |   2 +
 .../1.0.0-beta-2/testing/index.html             |   2 +
 .../1.0.0-beta-2/transient/index.html           |   2 +
 .../accumulo-export-queue/index.html            | 216 ++++++++++
 .../1.0.0-incubating/cfm/index.html             | 364 +++++++++++++++++
 .../1.0.0-incubating/export-queue/index.html    | 409 +++++++++++++++++++
 docs/fluo-recipes/1.0.0-incubating/index.html   | 202 +++++++++
 .../1.0.0-incubating/recording-tx/index.html    | 187 +++++++++
 .../1.0.0-incubating/row-hasher/index.html      | 235 +++++++++++
 .../1.0.0-incubating/serialization/index.html   | 188 +++++++++
 .../table-optimization/index.html               | 177 ++++++++
 .../1.0.0-incubating/testing/index.html         | 129 ++++++
 .../1.0.0-incubating/transient/index.html       | 196 +++++++++
 docs/index.html                                 |   2 +-
 feed.xml                                        |  74 +++-
 index.html                                      |  12 +-
 news/index.html                                 |   5 +
 .../fluo-recipes-1.0.0-incubating/index.html    | 163 ++++++++
 release/index.html                              |   7 +-
 36 files changed, 2571 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index ecbb3b8..b5fbaf1 100644
--- a/README.md
+++ b/README.md
@@ -54,7 +54,7 @@ Steps to update website for new Fluo Recipes release:
 
     ```bash
     cd fluo-website
-    mkdir -p docs/1.0.0-beta-1
+    mkdir -p docs/fluo-recipes/1.0.0-beta-1
     ./_scripts/convert-recipes-docs.py /path/to/fluo-recipes/docs/ /path/to/fluo-website/docs/fluo-recipes/1.0.0-beta-1/
     ```
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/api/archive/index.html
----------------------------------------------------------------------
diff --git a/api/archive/index.html b/api/archive/index.html
index 1303c21..df6988f 100644
--- a/api/archive/index.html
+++ b/api/archive/index.html
@@ -92,8 +92,8 @@
 <h4 id="fluo-recipes-api-documentation-before-apache">Fluo Recipes API documentation (before Apache)</h4>
 
 <ul>
-  <li><strong>1.0.0-beta-2</strong>: <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-core/1.0.0-beta-2/" target="_blank">core</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-accumulo/1.0.0-beta-2/" target="_blank">accumulo</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-kryo/1.0.0-beta-2/" target="_blank">kryo</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-spark/1.0.0-beta-2/" target="_blank">spark</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-test/1.0.0-beta-2/" target="_blank">test</a> - March 19, 2016</li>
-  <li><strong>1.0.0-beta-1</strong>: <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-core/1.0.0-beta-1/" target="_blank">core</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-accumulo/1.0.0-beta-1/" target="_blank">accumulo</a> - January 13, 2016</li>
+  <li>1.0.0-beta-2: <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-core/1.0.0-beta-2/" target="_blank">core</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-accumulo/1.0.0-beta-2/" target="_blank">accumulo</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-kryo/1.0.0-beta-2/" target="_blank">kryo</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-spark/1.0.0-beta-2/" target="_blank">spark</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-test/1.0.0-beta-2/" target="_blank">test</a> - March 19, 2016</li>
+  <li>1.0.0-beta-1: <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-core/1.0.0-beta-1/" target="_blank">core</a>, <a href="https://javadoc.io/doc/io.fluo/fluo-recipes-accumulo/1.0.0-beta-1/" target="_blank">accumulo</a> - January 13, 2016</li>
 </ul>
 
   </article>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/api/index.html
----------------------------------------------------------------------
diff --git a/api/index.html b/api/index.html
index 6da3ac9..50b9792 100644
--- a/api/index.html
+++ b/api/index.html
@@ -90,7 +90,7 @@
 <h4 id="apache-fluo-recipes-api">Apache Fluo Recipes API</h4>
 
 <ul>
-  <li>The first release of Apache Fluo Recipes has not been made yet.</li>
+  <li>1.0.0-incubating: <a href="https://javadoc.io/doc/org.apache.fluo/fluo-recipes-core/1.0.0-incubating/" target="_blank">core</a>, <a href="https://javadoc.io/doc/org.apache.fluo/fluo-recipes-accumulo/1.0.0-incubating/" target="_blank">accumulo</a>, <a href="https://javadoc.io/doc/org.apache.fluo/fluo-recipes-kryo/1.0.0-incubating/" target="_blank">kryo</a>, <a href="https://javadoc.io/doc/org.apache.fluo/fluo-recipes-spark/1.0.0-incubating/" target="_blank">spark</a>, <a href="https://javadoc.io/doc/org.apache.fluo/fluo-recipes-test/1.0.0-incubating/" target="_blank">test</a> - October 28, 2016</li>
 </ul>
 
 <p>API for releases before joining Apache have been <a href="/api/archive">archived</a>.</p>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/cfm/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/cfm/index.html b/docs/fluo-recipes/1.0.0-beta-1/cfm/index.html
index 7f64b18..da338bc 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/cfm/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/cfm/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/export-queue/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/export-queue/index.html b/docs/fluo-recipes/1.0.0-beta-1/export-queue/index.html
index 944a2c9..08ad02b 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/export-queue/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/export-queue/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/index.html b/docs/fluo-recipes/1.0.0-beta-1/index.html
index b7089ce..aaa9203 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/recording-tx/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/recording-tx/index.html b/docs/fluo-recipes/1.0.0-beta-1/recording-tx/index.html
index d11b407..86c29b0 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/recording-tx/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/recording-tx/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/serialization/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/serialization/index.html b/docs/fluo-recipes/1.0.0-beta-1/serialization/index.html
index faaf44c..d9063be 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/serialization/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/serialization/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/table-optimization/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/table-optimization/index.html b/docs/fluo-recipes/1.0.0-beta-1/table-optimization/index.html
index 505b8e9..8ab0f1e 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/table-optimization/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/table-optimization/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-1/transient/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-1/transient/index.html b/docs/fluo-recipes/1.0.0-beta-1/transient/index.html
index c8bddf0..e3b26c8 100644
--- a/docs/fluo-recipes/1.0.0-beta-1/transient/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-1/transient/index.html
@@ -75,7 +75,7 @@
             <div class="fluo-doc">
 
   
-  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-beta-2">latest docs</a>!</div>
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-1 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
   
 
   

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/accumulo-export/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/accumulo-export/index.html b/docs/fluo-recipes/1.0.0-beta-2/accumulo-export/index.html
index 132df8b..b651a66 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/accumulo-export/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/accumulo-export/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/cfm/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/cfm/index.html b/docs/fluo-recipes/1.0.0-beta-2/cfm/index.html
index 2af6ea0..e4a4ad2 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/cfm/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/cfm/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/export-queue/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/export-queue/index.html b/docs/fluo-recipes/1.0.0-beta-2/export-queue/index.html
index 8246e91..49fdfde 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/export-queue/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/export-queue/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/index.html b/docs/fluo-recipes/1.0.0-beta-2/index.html
index dcd725c..fd12b2a 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/recording-tx/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/recording-tx/index.html b/docs/fluo-recipes/1.0.0-beta-2/recording-tx/index.html
index 897fe3b..c9eda7d 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/recording-tx/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/recording-tx/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/row-hasher/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/row-hasher/index.html b/docs/fluo-recipes/1.0.0-beta-2/row-hasher/index.html
index be3d54e..cc38295 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/row-hasher/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/row-hasher/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/serialization/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/serialization/index.html b/docs/fluo-recipes/1.0.0-beta-2/serialization/index.html
index e910e7b..9bf96f1 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/serialization/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/serialization/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/table-optimization/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/table-optimization/index.html b/docs/fluo-recipes/1.0.0-beta-2/table-optimization/index.html
index 5e262b5..4c87933 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/table-optimization/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/table-optimization/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/testing/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/testing/index.html b/docs/fluo-recipes/1.0.0-beta-2/testing/index.html
index a367e3f..3ed0923 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/testing/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/testing/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-beta-2/transient/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-beta-2/transient/index.html b/docs/fluo-recipes/1.0.0-beta-2/transient/index.html
index bfdf350..eda4c09 100644
--- a/docs/fluo-recipes/1.0.0-beta-2/transient/index.html
+++ b/docs/fluo-recipes/1.0.0-beta-2/transient/index.html
@@ -75,6 +75,8 @@
             <div class="fluo-doc">
 
   
+  <div class="alert alert-danger" role="alert">These docs are for Fluo Recipes 1.0.0-beta-2 which is an old version! Check out the <a href="/docs/fluo-recipes/1.0.0-incubating">latest docs</a>!</div>
+  
 
   
   <div class="alert alert-danger" role="alert">These docs are for a release of Fluo Recipes made before Apache incubation.</div>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-incubating/accumulo-export-queue/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-incubating/accumulo-export-queue/index.html b/docs/fluo-recipes/1.0.0-incubating/accumulo-export-queue/index.html
new file mode 100644
index 0000000..8ad505c
--- /dev/null
+++ b/docs/fluo-recipes/1.0.0-incubating/accumulo-export-queue/index.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="/stylesheets/fluo.css">
+    <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Montserrat:700,400">
+    <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Merriweather">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" >
+    <link rel="canonical" href="https://fluo.apache.org//docs/fluo-recipes/1.0.0-incubating/accumulo-export-queue/">
+    <link rel="icon" type="image/png" href="/resources/favicon.png">
+    <title>Accumulo Export Queue Specialization | Apache Fluo</title>
+    <!--[if lt IE 9]>
+      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+  </head>
+  <body>
+    <div id="fluo-nav" class="navbar navbar-default navbar-static-top">
+      <div class="container">
+        <div class="navbar-header">
+          <div class="navbar-toggle-wrapper visible-xs">
+            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".js-navbar-collapse">
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+            </button>
+          </div>
+          <a href="/" class="navbar-brand"><img src="/resources/fluo-logo.png" alt="Apache Fluo"></a>
+        </div>
+        <div class="collapse navbar-collapse js-navbar-collapse" style="margin-top: 20px">
+          <ul class="navbar-nav nav">
+            <li><a href="/release/">Releases</a></li>
+            <li><a href="/tour/">Tour</a></li>
+            <li><a href="/docs/">Docs</a></li>
+            <li><a href="/api/">API</a></li>
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Community<span class="caret"></span></a>
+              <ul class="dropdown-menu">
+                <li><a href="/getinvolved/">Get Involved</a></li>
+                <li><a href="/news/">News Archive</a></li>
+                <li><a href="/people/">People</a></li>
+                <li><a href="/related-projects/">Related Projects</a></li>
+                <li><a href="/poweredby/">Powered By</a></li>
+              </ul>
+            </li>
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Contributing<span class="caret"></span></a>
+              <ul class="dropdown-menu">
+                <li><a href="/how-to-contribute/">How To Contribute</a></li>
+                <li><a href="/release-process/">Release Process</a></li>
+              </ul>
+            </li>
+          </ul>
+          <ul class="navbar-nav nav navbar-right">
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Apache Software Foundation<span class="caret"></span></a>
+              <ul class="dropdown-menu">
+                <li><a href="https://www.apache.org">Apache Homepage</a></li>
+                <li><a href="https://www.apache.org/licenses/LICENSE-2.0">License</a></li>
+                <li><a href="https://www.apache.org/foundation/sponsorship">Sponsorship</i></a></li>
+                <li><a href="https://www.apache.org/security">Security</a></li>
+                <li><a href="https://www.apache.org/foundation/thanks">Thanks</a></li>
+                <li><a href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a></li>
+              </ul>
+            </li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div class="container">
+      <div class="row">
+          <div class="col-sm-12">
+            <div class="fluo-doc">
+
+  
+
+  
+
+  <header class="post-header">
+    <h2 class="post-title">Accumulo Export Queue Specialization</h2>
+  </header>
+
+  <article id="page-content">
+    <h2 id="background">Background</h2>
+
+<p>The <a href="/docs/fluo-recipes/1.0.0-incubating/export-queue/">Export Queue Recipe</a> provides a generic foundation for building export mechanism to any
+external data store. The <a href="https://static.javadoc.io/org.apache.fluo/fluo-recipes-accumulo/1.0.0-incubating/org/apache/fluo/recipes/accumulo/export/AccumuloExporter.html">AccumuloExporter</a> provides an implementation of this recipe for
+Accumulo. The <a href="https://static.javadoc.io/org.apache.fluo/fluo-recipes-accumulo/1.0.0-incubating/org/apache/fluo/recipes/accumulo/export/AccumuloExporter.html">AccumuloExporter</a> is located the <code class="highlighter-rouge">fluo-recipes-accumulo</code> module and provides the
+following functionality:</p>
+
+<ul>
+  <li>Safely batches writes to Accumulo made by multiple transactions exporting data.</li>
+  <li>Stores Accumulo connection information in Fluo configuration, making it accessible by Export
+Observers running on other nodes.</li>
+  <li>Provides utility code that make it easier and shorter to code common Accumulo export patterns.</li>
+</ul>
+
+<h2 id="example-use">Example Use</h2>
+
+<p>Exporting to Accumulo is easy. Follow the steps below:</p>
+
+<ol>
+  <li>
+    <p>Implement a class that extends <a href="https://static.javadoc.io/org.apache.fluo/fluo-recipes-accumulo/1.0.0-incubating/org/apache/fluo/recipes/accumulo/export/AccumuloExporter.html">AccumuloExporter</a>.  This class will process exported objects that
+are placed on your export queue. For example, the <code class="highlighter-rouge">SimpleExporter</code> class below processes String
+key/value exports and generates mutations for Accumulo.</p>
+
+    <p>```java
+ public class SimpleExporter extends AccumuloExporter&lt;String, String&gt; {</p>
+
+    <p>@Override
+   protected void translate(SequencedExport&lt;String, String&gt; export, Consumer<Mutation> consumer) {
+     Mutation m = new Mutation(export.getKey());
+     m.put("cf", "cq", export.getSequence(), export.getValue());
+     consumer.accept(m);
+   }
+ }
+ ```</Mutation></p>
+  </li>
+  <li>
+    <p>With a <code class="highlighter-rouge">SimpleExporter</code> created, configure an <code class="highlighter-rouge">ExportQueue</code> to use <code class="highlighter-rouge">SimpleExporter</code> and
+give it information on how to connect to Accumulo.</p>
+
+    <p>```java</p>
+
+    <p>FluoConfiguration fluoConfig = …;</p>
+
+    <p>// Set accumulo configuration
+ String instance =       // Name of accumulo instance exporting to
+ String zookeepers =     // Zookeepers used by Accumulo instance exporting to
+ String user =           // Accumulo username, user that can write to exportTable
+ String password =       // Accumulo user password
+ String exportTable =    // Name of table to export to</p>
+
+    <p>// Create config for export table.
+ AccumuloExporter.Configuration exportTableCfg =
+     new AccumuloExporter.Configuration(instance, zookeepers, user, password, exportTable);</p>
+
+    <p>// Create config for export queue.
+ ExportQueue.Options eqOpts = new ExportQueue.Options(EXPORT_QUEUE_ID, SimpleExporter.class,
+     String.class, String.class, numMapBuckets).setExporterConfiguration(exportTableCfg);</p>
+
+    <p>// Configure export queue.  This will modify fluoConfig.
+ ExportQueue.configure(fluoConfig, qeOpts);</p>
+
+    <p>// Initialize Fluo using fluoConfig
+ ```</p>
+  </li>
+  <li>
+    <p>Export queues can be retrieved in Fluo observers and objects can be added to them:</p>
+
+    <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyObserver</span> <span class="kd">extends</span> <span class="n">AbstractObserver</span> <span class="o">{</span>
+
+  <span class="n">ExportQueue</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">exportQ</span><span class="o">;</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+    <span class="n">exportQ</span> <span class="o">=</span> <span class="n">ExportQueue</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="n">EXPORT_QUEUE_ID</span><span class="o">,</span> <span class="n">context</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">());</span>
+  <span class="o">}</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">row</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="o">{</span>
+
+    <span class="c1">// Read some data and do some work</span>
+
+    <span class="c1">// Add results to export queue</span>
+    <span class="n">String</span> <span class="n">key</span> <span class="o">=</span>    <span class="c1">// key that identifies export</span>
+    <span class="n">String</span> <span class="n">value</span> <span class="o">=</span>  <span class="c1">// object to export</span>
+    <span class="n">export</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">key</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
+  <span class="o">}</span>
+</code></pre>
+    </div>
+  </li>
+</ol>
+
+<h2 id="other-use-cases">Other use cases</h2>
+
+<p><a href="https://static.javadoc.io/org.apache.fluo/fluo-recipes-accumulo/1.0.0-incubating/org/apache/fluo/recipes/accumulo/export/AccumuloReplicator.html">AccumuloReplicator</a> is a specialized <a href="https://static.javadoc.io/org.apache.fluo/fluo-recipes-accumulo/1.0.0-incubating/org/apache/fluo/recipes/accumulo/export/AccumuloExporter.html">AccumuloExporter</a> that replicates a Fluo table to Accumulo.</p>
+
+
+  </article>
+
+</div>
+
+          </div>
+      </div>
+      <hr>
+      <div class="row footer">
+        <div class="col-sm-12 text-center">
+          <div class="center-block">
+          <a href="https://apache.org"><img src="/resources/feather.png" alt="Apache"></a>
+          Copyright &copy; 2016 The Apache Software Foundation. Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache&nbsp;License,&nbsp;Version&nbsp;2.0</a>
+          </div>
+        </div>
+      </div>
+    </div>
+    <script src="/javascripts/jquery.min.js"></script>
+    <script src="/javascripts/bootstrap.min.js"></script>
+    <!-- Place your <script> tags here. -->
+
+<!-- Google Analytics -->
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-55360307-1', 'auto');
+  ga('send', 'pageview');
+
+</script>
+
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-fluo-website/blob/f6125fa2/docs/fluo-recipes/1.0.0-incubating/cfm/index.html
----------------------------------------------------------------------
diff --git a/docs/fluo-recipes/1.0.0-incubating/cfm/index.html b/docs/fluo-recipes/1.0.0-incubating/cfm/index.html
new file mode 100644
index 0000000..baccd0b
--- /dev/null
+++ b/docs/fluo-recipes/1.0.0-incubating/cfm/index.html
@@ -0,0 +1,364 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="/stylesheets/fluo.css">
+    <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Montserrat:700,400">
+    <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Merriweather">
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" >
+    <link rel="canonical" href="https://fluo.apache.org//docs/fluo-recipes/1.0.0-incubating/cfm/">
+    <link rel="icon" type="image/png" href="/resources/favicon.png">
+    <title>Collision Free Map Recipe | Apache Fluo</title>
+    <!--[if lt IE 9]>
+      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+  </head>
+  <body>
+    <div id="fluo-nav" class="navbar navbar-default navbar-static-top">
+      <div class="container">
+        <div class="navbar-header">
+          <div class="navbar-toggle-wrapper visible-xs">
+            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".js-navbar-collapse">
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+            </button>
+          </div>
+          <a href="/" class="navbar-brand"><img src="/resources/fluo-logo.png" alt="Apache Fluo"></a>
+        </div>
+        <div class="collapse navbar-collapse js-navbar-collapse" style="margin-top: 20px">
+          <ul class="navbar-nav nav">
+            <li><a href="/release/">Releases</a></li>
+            <li><a href="/tour/">Tour</a></li>
+            <li><a href="/docs/">Docs</a></li>
+            <li><a href="/api/">API</a></li>
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Community<span class="caret"></span></a>
+              <ul class="dropdown-menu">
+                <li><a href="/getinvolved/">Get Involved</a></li>
+                <li><a href="/news/">News Archive</a></li>
+                <li><a href="/people/">People</a></li>
+                <li><a href="/related-projects/">Related Projects</a></li>
+                <li><a href="/poweredby/">Powered By</a></li>
+              </ul>
+            </li>
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Contributing<span class="caret"></span></a>
+              <ul class="dropdown-menu">
+                <li><a href="/how-to-contribute/">How To Contribute</a></li>
+                <li><a href="/release-process/">Release Process</a></li>
+              </ul>
+            </li>
+          </ul>
+          <ul class="navbar-nav nav navbar-right">
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Apache Software Foundation<span class="caret"></span></a>
+              <ul class="dropdown-menu">
+                <li><a href="https://www.apache.org">Apache Homepage</a></li>
+                <li><a href="https://www.apache.org/licenses/LICENSE-2.0">License</a></li>
+                <li><a href="https://www.apache.org/foundation/sponsorship">Sponsorship</i></a></li>
+                <li><a href="https://www.apache.org/security">Security</a></li>
+                <li><a href="https://www.apache.org/foundation/thanks">Thanks</a></li>
+                <li><a href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a></li>
+              </ul>
+            </li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div class="container">
+      <div class="row">
+          <div class="col-sm-12">
+            <div class="fluo-doc">
+
+  
+
+  
+
+  <header class="post-header">
+    <h2 class="post-title">Collision Free Map Recipe</h2>
+  </header>
+
+  <article id="page-content">
+    <h2 id="background">Background</h2>
+
+<p>When many transactions are trying to modify the same keys, collisions will occur.
+These collisions will cause the transactions to fail and throughput to nose
+dive.  For example consider the <a href="https://github.com/fluo-io/phrasecount">phrasecount</a> example.  In this example many
+transactions are processing documents as input.  Each transaction counts the
+phrases in its document and then tries to update global phrase counts.  With
+each transaction attempting to update many phrase counts, the probability of
+two transactions colliding is very high.</p>
+
+<h2 id="solution">Solution</h2>
+
+<p>This recipe provides a reusable solution for the problem of many transactions
+updating many keys while avoiding collisions.  As an added bonus, this recipe
+also organizes updates into batches for efficiency in order to improve
+throughput.</p>
+
+<p>The central idea behind this recipe is that updates to a key are queued up to
+be processed by another transaction triggered by weak notifications.  In the
+phrase count example transactions processing documents would queue updates,
+but would not actually update the counts.  Below is an example of how
+transactions would compute phrasecounts using this recipe.</p>
+
+<ul>
+  <li>TX1 queues <code class="highlighter-rouge">+1</code> update  for phrase <code class="highlighter-rouge">we want lambdas now</code></li>
+  <li>TX2 queues <code class="highlighter-rouge">+1</code> update  for phrase <code class="highlighter-rouge">we want lambdas now</code></li>
+  <li>TX3 reads the updates and current value for the phrase <code class="highlighter-rouge">we want lambdas now</code>.  There is no current value and the updates sum to 2, so a new value of 2 is written.</li>
+  <li>TX4 queues <code class="highlighter-rouge">+2</code> update  for phrase <code class="highlighter-rouge">we want lambdas now</code></li>
+  <li>TX5 queues <code class="highlighter-rouge">-1</code> update  for phrase <code class="highlighter-rouge">we want lambdas now</code></li>
+  <li>TX6 reads the updates and current value for the phrase <code class="highlighter-rouge">we want lambdas now</code>.  The current value is 2 and the updates sum to 1, so a new value of 3 is written.</li>
+</ul>
+
+<p>Transactions processing updates have the ability to make additional updates.
+For example in addition to updating the current value for a phrase, the new
+value could also be placed on an export queue to update an external database.</p>
+
+<h3 id="buckets">Buckets</h3>
+
+<p>A simple implementation of this recipe would be to have an update queue for
+each key.  However the implementation does something slightly more complex.
+Each update queue is in a bucket and transactions that process updates, process
+all of the updates in a bucket.  This allows more efficient processing of
+updates for the following reasons :</p>
+
+<ul>
+  <li>When updates are queued, notifications are made per bucket(instead of per a key).</li>
+  <li>The transaction doing the update can scan the entire bucket reading updates, this avoids a seek for each key being updated.</li>
+  <li>Also the transaction can request a batch lookup to get the current value of all the keys being updated.</li>
+  <li>Any additional actions taken on update (like adding something to an export queue) can also be batched.</li>
+  <li>Data is organized to make reading exiting values for keys in a bucket more efficient.</li>
+</ul>
+
+<p>Which bucket a key goes to is decided using hash and modulus so that multiple
+updates for the same key always go to the same bucket.</p>
+
+<p>The initial number of tablets to create when applying table optimizations can be
+controlled by setting the buckets per tablet option when configuring a Collision
+Free Map.  For example if you have 20 tablet servers and 1000 buckets and want
+2 tablets per tserver initially then set buckets per tablet to 1000/(2*20)=25.</p>
+
+<h2 id="example-use">Example Use</h2>
+
+<p>The following code snippets show how to setup and use this recipe for
+wordcount.  The first step in using this recipe is to configure it before
+initializing Fluo.  When initializing an ID will need to be provided.  This ID
+is used in two ways.  First, the ID is used as a row prefix in the table.
+Therefore nothing else should use that row range in the table.  Second, the ID
+is used in generating configuration keys associated with the instance of the
+Collision Free Map.</p>
+
+<p>The following snippet shows how to setup a collision free map.</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span> <span class="o">=</span> <span class="o">...;</span>
+
+  <span class="kt">int</span> <span class="n">numBuckets</span> <span class="o">=</span> <span class="mi">119</span><span class="o">;</span>
+
+  <span class="n">WordCountMap</span><span class="o">.</span><span class="na">configure</span><span class="o">(</span><span class="n">fluoConfig</span><span class="o">,</span> <span class="mi">119</span><span class="o">);</span>
+
+  <span class="c1">//initialize Fluo using fluoConfig</span>
+
+</code></pre>
+</div>
+
+<p>Assume the following observer is triggered when a documents contents are
+updated.  It examines new and old document content and determines changes in
+word counts.  These changes are pushed to a collision free map.</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DocumentObserver</span> <span class="kd">extends</span> <span class="n">TypedObserver</span> <span class="o">{</span>
+
+  <span class="n">CollisionFreeMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">wcm</span><span class="o">;</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+    <span class="n">wcm</span> <span class="o">=</span> <span class="n">CollisionFreeMap</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="n">WordCountMap</span><span class="o">.</span><span class="na">ID</span><span class="o">,</span> <span class="n">context</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">());</span>
+  <span class="o">}</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="n">ObservedColumn</span> <span class="nf">getObservedColumn</span><span class="o">()</span> <span class="o">{</span>
+    <span class="k">return</span> <span class="k">new</span> <span class="nf">ObservedColumn</span><span class="o">(</span><span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"content"</span><span class="o">,</span> <span class="s">"new"</span><span class="o">),</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">STRONG</span><span class="o">);</span>
+  <span class="o">}</span>
+
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TypedTransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">row</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">String</span> <span class="n">newContent</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">get</span><span class="o">().</span><span class="na">row</span><span class="o">(</span><span class="n">row</span><span class="o">).</span><span class="na">col</span><span class="o">(</span><span class="n">col</span><span class="o">).</span><span class="na">toString</span><span class="o">();</span>
+    <span class="n">String</span> <span class="n">currentContent</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">get</span><span class="o">().</span><span class="na">row</span><span class="o">(</span><span class="n">row</span><span class="o">).</span><span class="na">fam</span><span class="o">(</span><span class="s">"content"</span><span class="o">).</span><span class="na">qual</span><span class="o">(</span><span class="s">"current"</span><span class="o">).</span><span class="na">toString</span><span class="o">(</span><span class="s">""</span><span class="o">);</span>
+
+    <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">newWordCounts</span> <span class="o">=</span> <span class="n">getWordCounts</span><span class="o">(</span><span class="n">newContent</span><span class="o">);</span>
+    <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">currentWordCounts</span> <span class="o">=</span> <span class="n">getWordCounts</span><span class="o">(</span><span class="n">currentContent</span><span class="o">);</span>
+
+    <span class="c1">//determine changes in word counts between old and new document content</span>
+    <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">changes</span> <span class="o">=</span> <span class="n">calculateChanges</span><span class="o">(</span><span class="n">newWordCounts</span><span class="o">,</span> <span class="n">currentWordCounts</span><span class="o">);</span>    
+
+    <span class="c1">//queue updates to word counts for processing by other transactions</span>
+    <span class="n">wcm</span><span class="o">.</span><span class="na">update</span><span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">changes</span><span class="o">);</span>
+
+    <span class="c1">//update the current content and delete the new content</span>
+    <span class="n">tx</span><span class="o">.</span><span class="na">mutate</span><span class="o">().</span><span class="na">row</span><span class="o">(</span><span class="n">row</span><span class="o">).</span><span class="na">fam</span><span class="o">(</span><span class="s">"content"</span><span class="o">).</span><span class="na">qual</span><span class="o">(</span><span class="s">"current"</span><span class="o">).</span><span class="na">set</span><span class="o">(</span><span class="n">newContent</span><span class="o">);</span>
+    <span class="n">tx</span><span class="o">.</span><span class="na">mutate</span><span class="o">().</span><span class="na">row</span><span class="o">(</span><span class="n">row</span><span class="o">).</span><span class="na">col</span><span class="o">(</span><span class="n">col</span><span class="o">).</span><span class="na">delete</span><span class="o">();</span>
+  <span class="o">}</span>
+
+  <span class="kd">private</span> <span class="kd">static</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="nf">getWordCounts</span><span class="o">(</span><span class="n">String</span> <span class="n">doc</span><span class="o">)</span> <span class="o">{</span>
+   <span class="c1">//TODO extract words from doc</span>
+  <span class="o">}</span>
+
+  <span class="kd">private</span> <span class="kd">static</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="nf">calculateChanges</span><span class="o">(</span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">newCounts</span><span class="o">,</span>
+      <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">currCounts</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">changes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;&gt;();</span>
+
+    <span class="c1">// guava Maps class</span>
+    <span class="n">MapDifference</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">diffs</span> <span class="o">=</span> <span class="n">Maps</span><span class="o">.</span><span class="na">difference</span><span class="o">(</span><span class="n">currCounts</span><span class="o">,</span> <span class="n">newCounts</span><span class="o">);</span>
+
+    <span class="c1">// compute the diffs for words that changed</span>
+    <span class="n">changes</span><span class="o">.</span><span class="na">putAll</span><span class="o">(</span><span class="n">Maps</span><span class="o">.</span><span class="na">transformValues</span><span class="o">(</span><span class="n">diffs</span><span class="o">.</span><span class="na">entriesDiffering</span><span class="o">(),</span>
+        <span class="n">vDiff</span> <span class="o">-&gt;</span> <span class="n">vDiff</span><span class="o">.</span><span class="na">rightValue</span><span class="o">()</span> <span class="o">-</span> <span class="n">vDiff</span><span class="o">.</span><span class="na">leftValue</span><span class="o">()));</span>
+
+    <span class="c1">// add all new words</span>
+    <span class="n">changes</span><span class="o">.</span><span class="na">putAll</span><span class="o">(</span><span class="n">diffs</span><span class="o">.</span><span class="na">entriesOnlyOnRight</span><span class="o">());</span>
+
+    <span class="c1">// subtract all words no longer present</span>
+    <span class="n">changes</span><span class="o">.</span><span class="na">putAll</span><span class="o">(</span><span class="n">Maps</span><span class="o">.</span><span class="na">transformValues</span><span class="o">(</span><span class="n">diffs</span><span class="o">.</span><span class="na">entriesOnlyOnLeft</span><span class="o">(),</span> <span class="n">l</span> <span class="o">-&gt;</span> <span class="n">l</span> <span class="o">*</span> <span class="o">-</span><span class="mi">1</span><span class="o">));</span>
+
+    <span class="k">return</span> <span class="n">changes</span><span class="o">;</span>
+  <span class="o">}</span>
+
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>Each collision free map has two extension points, a combiner and an update
+observer.  These two extension points are defined below as <code class="highlighter-rouge">WordCountCombiner</code>
+and  <code class="highlighter-rouge">WordCountObserver</code>.  The collision free map configures a Fluo observer that
+will process queued updates.  When processing these queued updates the two
+extension points are called.  In this example <code class="highlighter-rouge">WordCountCombiner</code> is called to
+combine updates that were queued by <code class="highlighter-rouge">DocumentObserver</code>. The collision free map
+will process a batch of keys, calling the combiner for each key.  When finished
+processing a batch, it will call the update observer <code class="highlighter-rouge">WordCountObserver</code>.</p>
+
+<p>An update observer can do additional processing when a batch of key values are
+updated.  In <code class="highlighter-rouge">WordCountObserver</code>, updates are queued for export to an external
+database.  The export is given the new and old value allowing it to delete the
+old value if needed.</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="cm">/**
+ * This class exists to provide a single place to put all code related to the
+ * word count map.
+ */</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">WordCountMap</span> <span class="o">{</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">ID</span> <span class="o">=</span> <span class="s">"wc"</span><span class="o">;</span>
+
+  <span class="cm">/**
+   * A helper method for configuring the word count map.
+   *
+   * @param numTablets the desired number of tablets to create when applying table optimizations
+   */</span>
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">,</span> <span class="kt">int</span> <span class="n">numBuckets</span><span class="o">,</span> <span class="kt">int</span> <span class="n">numTablets</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">Options</span> <span class="n">cfmOpts</span> <span class="o">=</span>
+      <span class="k">new</span> <span class="nf">Options</span><span class="o">(</span><span class="n">ID</span><span class="o">,</span> <span class="n">WordCountCombiner</span><span class="o">.</span><span class="na">class</span><span class="o">,</span>  <span class="n">WordCountObserver</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">String</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">Long</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">numBuckets</span><span class="o">)</span>
+        <span class="o">.</span><span class="na">setBucketsPerTablet</span><span class="o">(</span><span class="n">numBuckets</span><span class="o">/</span><span class="n">numTablets</span><span class="o">);</span>
+    <span class="n">CollisionFreeMap</span><span class="o">.</span><span class="na">configure</span><span class="o">(</span><span class="n">fluoConfig</span><span class="o">,</span> <span class="n">cfmOpts</span><span class="o">);</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">WordCountCombiner</span> <span class="kd">implements</span> <span class="n">Combiner</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">Optional</span><span class="o">&lt;</span><span class="n">Long</span><span class="o">&gt;</span> <span class="nf">combine</span><span class="o">(</span><span class="n">String</span> <span class="n">key</span><span class="o">,</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Long</span><span class="o">&gt;</span> <span class="n">updates</span><span class="o">)</span> <span class="o">{</span>
+      <span class="kt">long</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0L</span><span class="o">;</span>
+
+      <span class="k">while</span> <span class="o">(</span><span class="n">updates</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span>
+        <span class="n">sum</span> <span class="o">+=</span> <span class="n">updates</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
+      <span class="o">}</span>
+
+      <span class="k">if</span> <span class="o">(</span><span class="n">sum</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
+        <span class="c1">//returning absent will cause the collision free map to delte the current key</span>
+        <span class="k">return</span> <span class="n">Optional</span><span class="o">.</span><span class="na">absent</span><span class="o">();</span>
+      <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">Optional</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">sum</span><span class="o">);</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">WordCountObserver</span> <span class="kd">extends</span> <span class="n">UpdateObserver</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="o">{</span>
+
+    <span class="kd">private</span> <span class="n">ExportQueue</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">MyDatabaseExport</span><span class="o">&gt;</span> <span class="n">exportQ</span><span class="o">;</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">String</span> <span class="n">mapId</span><span class="o">,</span> <span class="n">Context</span> <span class="n">observerContext</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="n">exportQ</span> <span class="o">=</span> <span class="n">ExportQueue</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="n">MyExportQ</span><span class="o">.</span><span class="na">ID</span><span class="o">,</span> <span class="n">observerContext</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">());</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">updatingValues</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Update</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;&gt;</span> <span class="n">updates</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">while</span> <span class="o">(</span><span class="n">updates</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span>
+        <span class="n">Update</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">update</span> <span class="o">=</span> <span class="n">updates</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
+
+        <span class="n">String</span> <span class="n">word</span> <span class="o">=</span> <span class="n">update</span><span class="o">.</span><span class="na">getKey</span><span class="o">();</span>
+        <span class="n">Optional</span><span class="o">&lt;</span><span class="n">Long</span><span class="o">&gt;</span> <span class="n">oldVal</span> <span class="o">=</span> <span class="n">update</span><span class="o">.</span><span class="na">getOldValue</span><span class="o">();</span>
+        <span class="n">Optional</span><span class="o">&lt;</span><span class="n">Long</span><span class="o">&gt;</span> <span class="n">newVal</span> <span class="o">=</span> <span class="n">update</span><span class="o">.</span><span class="na">getNewValue</span><span class="o">();</span>
+
+        <span class="c1">//queue an export to let an external database know the word count has changed</span>
+        <span class="n">exportQ</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">word</span><span class="o">,</span> <span class="k">new</span> <span class="n">MyDatabaseExport</span><span class="o">(</span><span class="n">oldVal</span><span class="o">,</span> <span class="n">newVal</span><span class="o">));</span>
+      <span class="o">}</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<h2 id="guarantees">Guarantees</h2>
+
+<p>This recipe makes two important guarantees about updates for a key when it
+calls <code class="highlighter-rouge">updatingValues()</code> on an <code class="highlighter-rouge">UpdateObserver</code>.</p>
+
+<ul>
+  <li>The new value reported for an update will be derived from combining all
+updates that were committed before the transaction thats processing updates
+started.  The implementation may have to make multiple passes over queued
+updates to achieve this.  In the situation where TX1 queues a <code class="highlighter-rouge">+1</code> and later
+TX2 queues a <code class="highlighter-rouge">-1</code> for the same key, there is no need to worry about only seeing
+the <code class="highlighter-rouge">-1</code> processed.  A transaction that started processing updates after TX2
+committed would process both.</li>
+  <li>The old value will always be what was reported as the new value in the
+previous transaction that called <code class="highlighter-rouge">updatingValues()</code>.</li>
+</ul>
+
+
+  </article>
+
+</div>
+
+          </div>
+      </div>
+      <hr>
+      <div class="row footer">
+        <div class="col-sm-12 text-center">
+          <div class="center-block">
+          <a href="https://apache.org"><img src="/resources/feather.png" alt="Apache"></a>
+          Copyright &copy; 2016 The Apache Software Foundation. Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache&nbsp;License,&nbsp;Version&nbsp;2.0</a>
+          </div>
+        </div>
+      </div>
+    </div>
+    <script src="/javascripts/jquery.min.js"></script>
+    <script src="/javascripts/bootstrap.min.js"></script>
+    <!-- Place your <script> tags here. -->
+
+<!-- Google Analytics -->
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-55360307-1', 'auto');
+  ga('send', 'pageview');
+
+</script>
+
+  </body>
+</html>


Mime
View raw message