/*
 * 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 Notes - S2Graph - Version 0.2.0

** Sub-task
    * [S2GRAPH-129] - Restrict direct access on Edge's properties from other classes.
    * [S2GRAPH-130] - Edge.propsWithTs data type should be changed into mutable to support setter interface exist in tp3.
    * [S2GRAPH-131] - Add actual implementation on interfaces from TinkerPop3 structure package.
    * [S2GRAPH-148] - Provide Gremlin Plugin
    * [S2GRAPH-152] - Add IndexType on Management's createIndex
    * [S2GRAPH-153] - Implement IndexProvider(for Mixed IndexType) class
    * [S2GRAPH-157] - Check proper apache license header on all files for release 0.2.0
    * [S2GRAPH-158] - Bug fix on String type InnerVal encoding to use UTF-8 charsetName.
    * [S2GRAPH-160] - Remove warning while package
    * [S2GRAPH-161] - Update CHANGES file with correct release version

** Bug
    * [S2GRAPH-159] - Wrong syntax at a bash script under Linux

** Improvement
    * [S2GRAPH-72] - Support Apache TinkerPop and Gremlin
    * [S2GRAPH-121] - Create `Result` class to hold traverse result edges.
    * [S2GRAPH-122] - Change data types of Edge/IndexEdge/SnapshotEdge.
    * [S2GRAPH-132] - Support buffering for 'Increment RPC'
    * [S2GRAPH-133] - Deprecating Vagrant environment.
    * [S2GRAPH-135] - Change the way LabelIndexOption is implemented and improve it
    
** New Feature
    * [S2GRAPH-123] - Support different index on out/in direction.
    * [S2GRAPH-125] - Add options field on Label model for controlling advanced options.

** Task
    

Release 0.1.0 - Released

  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).

    S2GRAPH-12: Add Label Name Swap Feature.
        	(Contributed by Hyunsung Jo<hyunsung.jo@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)

    S2GRAPH-82: Merge DeferCache and FutureCache (Committed by Daewon Jeong).

    S2GRAPH-116: using ASM and ByteBuddy to add a proxy to Asynchbase's Scanner.
        	(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-117: Cleaner logging library usage.
        	(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-115: Release binary artifacts to Maven Central.
        	(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-124: Change JSONParser from Trait to Object (Committed by DOYUNG YOON).

    S2GRAPH-127: Refactor ExceptionHander Object into Class (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).

    S2GRAPH-118: Fix compile error on test cases on loader project (Committed by DOYUNG YOON).

    S2GRAPH-120: Netty version is conflict with play 2.5.9 (Committed by DOYUNG YOON).

    S2GRAPH-126: SBT error when there is no ~/.m2/settings.xml
                 (Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON)

    S2GRAPH-138: Fixed logging in Play! development mode
                 (Contributed by Jong Wook Kim<jongwook@nyu.edu>, 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).

    S2GRAPH-105: remove the full path on packaged tarball (Committed by Sergio Fernández).

  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).

    S2GRAPH-91: Remove custom repository on project's build.sbt (Committed by DOYUNG YOON).

    S2GRAPH-93: Remove MySQL JDBC driver (Committed by DOYUNG YOON).

    S2GRAPH-98: Make test cases on multiple projects run sequentially (Committed by DOYUNG YOON).

    S2GRAPH-99: Reduce number of test run on test cases on org.apache.s2graph.rest.play.benchmark (Committed by DOYUNG YOON).

    S2GRAPH-96: Remove unmanaged dependencies(asynchbase) and speficy it on build.sbt. (Committed by DOYUNG YOON).

    S2GRAPH-97: Add KEYS file (Committed by DOYUNG YOON).

    S2GRAPH-95: Add sbt-pgp plugin on plugins.sbt (Committed by DOYUNG YOON).

    S2GRAPH-92: Add proper license headers on files with unknown licenses (Committed by DOYUNG YOON).

    S2GRAPH-100: Add BUILD.md to explain how to package from source, then add it into REAME.md (Committed by DOYUNG YOON).

    S2GRAPH-94: Add description for project layout on REAME.
        	(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON).

    S2GRAPH-103: Remove dependencies on custom fork of asynchbase (Committed by DOYUNG YOON).

    S2GRAPH-102: Add more configuration optoins in application.conf (Committed by DOYUNG YOON).

    S2GRAPH-84: Test-case compilation error on `s2counter_loader` project (Committed by Jaesang Kim).

    S2GRAPH-104: force scalaz-stream, netty-http-pipelining dependencies version which is available on maven central (Committed by DOYUNG YOON).

    S2GRAPH-109: Merge duplicate test.sh into one same as `Your First Graph` on README.md (Committed by DOYUNG YOON).

    S2GRAPH-106: Remove warnings while package (Committed by DOYUNG YOON).

    S2GRAPH-112: Additional refinements in README.md
        	(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON).

    S2GRAPH-111: typo fix: getServiceLable -> getServiceLabel
        	(Contributed by Jong Wook Kim<jongwook@nyu.edu>, committed by DOYUNG YOON).

    S2GRAPH-110: Add more committer's public key to KEYS file (Committed by DOYUNG YOON).

    S2GRAPH-113: Add license header on `bin/example.sh` (Committed by DOYUNG YOON).

    S2GRAPH-114: `MethodNotSupportedException` class in s2counter_core project miss license header (Committed by DOYUNG YOON).

    S2GRAPH-136: Validate TinkerPop3 interface with gremlin-test suite. (Committed by DOYUNG YOON).

  TEST

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

    S2GRAPH-108: Support continuous integration test.
    (Contributed by Injun Song<ijsong@gmail.com>, committed by DOYUNG YOON)

    S2GRAPH-144: [S2GRAPH-144] Travis icon in README is not proper link
    (Contributed by Injun Song<ijsong@gmail.com>, committed by Daewon Jeong)

    S2GRAPH-145: [S2GRAPH-145] Improve travis to cache maven directory
    (Contributed by Injun Song<ijsong@gmail.com>, committed by Daewon Jeong)
