/*
 * 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.
 */

 Change Log

Release 0.12.1 - unreleased

  NEW FEATURES
    
    S2GRAPH-34: Provide option to select which field in edge's properties to run timeDecay function (Committed by DOYUNG YOON).

    S2GRAPH-35: Provide normalize option on query (Committed by DOYUNG YOON).

    S2GRAPH-36: Provide Blocking API for Edge/Vertex operations (Committed by DOYUNG YOON).

    S2GRAPH-32: Support variable such as now, day, hour on query (Committed by DOYUNG YOON).

    S2GRAPH-45: Provide way to call specific bucket on experiment (Committed by DOYUNG YOON).
  
    S2GRAPH-33: Support weighted sum of multiple query results (Committed by DOYUNG YOON).

    S2GRAPH-50: Provide new HBase Storage Schema (Committed by DOYUNG YOON).

    S2GRAPH-60: Add divide operation to scorePropagateOp.
		(Contributed by Junki Kim<wishoping@gmail.com>, committed by DOYUNG YOON).

  IMPROVEMENT

    S2GRAPH-14: Abstract HBase specific methods in Management and Label (Committed by DOYUNG YOON).

    S2GRAPH-24: Add counter config for readonly graph (Committed by Jaesang Kim).

    S2GRAPH-11: Performance tuning on sort by scoreSum on PostProcess (Committed by DOYUNG YOON).

    S2GRAPH-16: Performance tunning on where parser (Committed by DOYUNG YOON).

    S2GRAPH-37: Extract LockExpireDuration as configuration (Committed by DOYUNG YOON).

    S2GRAPH-39: Better exception message on converting between Json and InnerVal (Committed by DOYUNG YOON).

    S2GRAPH-40: PostProcess.toHashKey gives different hash key with same value when edge's label schema version is different 
                (Committed by DOYUNG YOON).

    S2GRAPH-41: Refactor PostProcess's toSimpleVertexArrJson (Committed by DOYUNG YOON).

    S2GRAPH-44: Provide cache for WhereParser on query (Committed by DOYUNG YOON).

    S2GRAPH-53: Refactor Storage to decide which serializer/deserializer for IndexEdge/SnapshotEdge/Vertex 
		(Committed by DOYUNG YOON).

    S2GRAPH-55: Add param to enable epoll event loop in experimental netty http server (Committed by daewon).
    
    S2GRAPH-66: Optimize toEdge, IndexEdgeDeserializable using mutable Map. (Committed by DOYUN GYOON).

    S2GRAPH-22: Add missing shebang line to file. 
		(Contributed by Injun Song<ijsong@gmail.com>, committed by DOYUNG YOON)
    
    S2GRAPH-70: Automate the process of building a distribution package
		(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

  BUG FIXES

    S2GRAPH-18: Query Option "interval" is Broken. 
                (Contributed by Hyunsung Jo<hyunsung.jo@gmail.com>, committed by daewon)

    S2GRAPH-20: bug fix in query option "sample".
                (Contributed by Hyunsung Jo<hyunsung.jo@gmail.com>, committed by DOYUNG YOON)
      
    S2GRAPH-28: _to option gives wrong result on query.	
                (Contributed by Hyunsung Jo<hyunsung.jo@gmail.com>, committed by DOYUNG YOON)
    
    S2GRAPH-38: Transform option gives wrong result since it transform degree edge too (Committed by DOYUNG YOON).

    S2GRAPH-42: Bug on EdgeTransformer with specific cases (Committed by DOYUNG YOON).

    S2GRAPH-43: Bug on offset when Interval is given on query (Committed by DOYUNG YOON).

    S2GRAPH-19: When query with duration error (Committed by DOYUNG YOON).
    
    S2GRAPH-63: Condition on partition strong edges and weak edges on mutateEdges is wrong (Committed by DOYUNG YOON).
   
    S2GRAPH-65: Deferred produce exception (Committed by DOYUNG YOON).

    S2GRAPH-64: incrementCounts yield type case exception (Committed by DOYUNG YOON).

  TASKS

    S2GRAPH-2: Update document and quick start environment to have recent set-up command changes.
               (Contributed by Hyunsung Jo<hyunsung.jo@gmail.com>, committed by daewon)

    S2GRAPH-5: Add Apache RAT to valid LICENSE errors. (Committed by DOYUNG YOON).

    S2GRAPH-17: Remove unnecessary abstraction layer, Storage. (Committed by DOYUNG YOON).
    
    S2GRAPH-57: Change package names into org.apahce.s2graph. (Committed by DOYUNG YOON).

    S2GRAPH-4: Update license headers in source codes. (Committed by DOYUNG YOON).
    
    S2GRAPH-61: Update README.md to have Apache mailing list. 
		(Contributed by Hyunsung Jo<hyunsung.jo@gmail.com>, committed by DOYUNG YOON)
	
    S2GRAPH-71: Missing resolver in plugin settings.
                (Contributed by Injun Song<ijsong@gmail.com>, committed by DOYUNG YOON)

    S2GRAPH-30: Typo in README. (Contributed by Hyunsung Jo<hyunsung.jo@gmail.com>, committed by DOYUNG YOON).

  SUB TASKS

    S2GRAPH-9: Provide rest server using netty. (Committed by daewon).

    S2GRAPH-7: Abstract common codes for rest project into s2core. (Committed by daewon).

    S2GRAPH-31: Remove playframework dependencies on s2core/build.sbt. (Committed by DOYUNG YOON).
    
    S2GRAPH-69: Change IndexEdge's props data type. (Committed by DOYUNG YOON).

    S2GRAPH-87: LICENSE file should be changed. (Committed by Sergio Fernández).
   
    S2GRAPH-73: Add an SBT task and relevant scripts to construct a package for distribution.
		(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-74: Add a script that starts/stops a local hbase server.
		(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-75: Use an embedded database as the default metadata storage.
		(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-81: Separate Serializable's toKeyValues into 3, toRowKey, toQualifier, toValue. (Committed by DOYUNG YOON).

    S2GRAPH-88: Add DISCLAIMER, LICENSE, NOTICE on packaging process.
		(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)
    
    S2GRAPH-89: Change version number on project. (Committed by DOYUNG YOON).

  TEST
    
    S2GRAPH-21: Change PostProcessBenchmarkSpec not to store and fetch test data from storage. (Committed by DOYUNG YOON).

