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

Apache HCatalog Change Log

Release 0.4.1 - Unreleased

  INCOMPATIBLE CHANGES

  NEW FEATURES

  IMPROVEMENTS

  BUG FIXES

Release 0.4.0 - Unreleased

  INCOMPATIBLE CHANGES
  HCAT-304 Remove hcat.hbase.column.mapping table property (rohini via gates)

  HCAT-358 Remove externed hive code from HCat code and use maven instead (thw and gates via gates)

  HCAT-359 hcatalog tar.gz should only have hcatalog binaries (gkesavan via gates)

  HCAT-267 rename 64 bit rpm/deb package (gkesavan via gates)

  HCAT-289 InputJobInfo still uses serverUri and serverKerberosPrincipal (khorgath via gates)

  HCAT-295 Rename storage-drivers directory to storage-handlers (gates)

  HCAT-264 Barrier for HCatOutputFormat for Pig/Mapreduce if the table contains feature only supported in Hive (daijy via gates)

  HCAT-279 Remove remaining code mentioning isd/osd (daijy via gates)

  HCAT-261 Enable more DDL statements for HCat (daijy via gates)

  HCAT-252 Rework HBase storage driver into HBase storage handler (rohini via toffer) 

  HCAT-265 remove deprecated HCatStorageHandler (toffer)

  HCAT-239. Changes to HCatInputFormat to make it use SerDes instead of StorageDrivers (vikram.dixit via gates)

  HCAT-245. StorageHandler authorization providers (enis via hashutosh) 

  HCAT-241. Changes to HCatRecord to support switch from StorageDriver to SerDe (khorgath)

  HCAT-240. Changes to HCatOutputFormat to make it use SerDes instead of StorageDriver (toffer)

  NEW FEATURES
  HCAT-342 enable hcat to work with hive bigtop rpm (thejas via gates)

  HCAT-287 Add data api to HCatalog (hashutosh)

  HCAT-310 Turn current RM implementation into HBase Coprocessor (thw via toffer)

  HCAT-334 HCatalog should generate a POM file so it can be deployed to a maven repo (traviscrawford via gates)

  HCAT-296 Hcatalog should be able talk to secure hbase server using hbase delegation tokens (rohini via toffer)

  HCAT-249 Rework JSON StorageDriver into a JSON SerDe (khorgath via gates)

  HCAT-255 Define hadoop properties on the hcat command line (ctdean via gates)

  HCAT-2 Support nested schema conversion between Hive an Pig (julienledem via hashutosh)

  IMPROVEMENTS
  HCAT-372 Add filter information to Load/Store and Input/Output docs (lefty via gates)

  HCAT-357 e2e harness: allow to run again pre-installed packages (thw via gates)

  HCAT-352 Need tests for complex types (gates)

  HCAT-268 Remove remnants of storage drivers. (rohini via gates)

  HCAT-306 Need more end-to-end tests (gates)

  HCAT-130 Documentation improvements (lefty and gates via gates)

  HCAT-266 Upgrade HBase dependency to 0.92 (thw via toffer)

  HCAT-243 HCat e2e tests need to change to not use StorageDrivers (gaets)

  HCAT-256 HCatalog should provide its classpath to tools (gates)

  HCAT-266 Upgrade HBase dependency to 0.92. (thw via toffer)

  HCAT-253 HBase revision manager should configure/drop znodes in the create/drop table meta hooks in the storage handler. (avandana via toffer)

  HCAT-259 Make readFields() and write() in LazyHCatRecord work (gates via khorgath)

  HCAT-194. Better error messages for HCatalog access control errors (julienledem via hashutosh)  
  
  OPTIMIZATIONS

  BUG FIXES
  HCAT-395 Hcat 0.4 last minute doc fixes (gates)

  HCAT-394 HCatalog 0.4 should pull hive-0.9.0 from maven instead of 0.9.0-SNAPSHOT (gates)

  HCAT-386 e2e tests should respect JAVA_HOME when it's set (gates)

  HCAT-378 Found a few source files missing Apache headers (gates)

  HCAT-377 Recent changes broke releaseaudit target (gates)

  HCAT-367 Pig writes data but partition information isn't getting updated (rohini via gates)

  HCAT-365 HCatUtil.getStorageHandler should set the configuration (traviscrawford via gates)

  HCAT-371 A few javadoc warnings have crept into HCat (gates)

  HCAT-320 Remove filtering of table properties which are not prefix with "hcat." (rohini via gates)

  HCAT-354 hive-hbase-handler jar not getting put in hcat package (gates)

  HCAT-348 HCatUtil::getHiveConf(Configuration) ignores passed-in conf while creating HiveConf (gates)

  HCAT-312 Hcatalog rpms change the ownership of /usr/lib64 to hcat user (gkesavan via gates)

  HCAT-301 Reading from a table created with upper case table name throws error. (rohini via toffer)

  HCAT-319 Cleanup of 0.3 mapred classes (khorgath via gates)

  HCAT-302 unable to write to hbase channel. HBaseHCatStorageHandler class not found (rohini via gates)

  HCAT-338 A couple of typos in the 0.4.0 document (gates)

  HCAT-335 Release notes issues for 0.4 (gates)

  HCAT-291 Pig and MR fail to write to a sequence file (avandana via gates)

  HCAT-305 hcat shell is not properly picking up the hcat jar (gates)

  HCAT-307 NOTICE and LICENSE file need updated to add new jars and move copyright date to 2012 (gates)

  HCAT-300 A number of files lack Apache license headers (gates)

  HCAT-299 Javadoc build issues (gates)

  HCAT-303 Fix build failure due to HBaseSerDe.parseColumnMapping method signature change in hive (rohini via toffer)

  HCAT-282 HCatInputFormat shouldn't expect storageHandler to be serializable (khorgath via gates)

  HCAT-281 HCat use table schema instead of partition schema to read partition data (daijy and khorgath via gates)

  HCAT 286 NPE in HdfsAuthorizationProvider (enis via gates)

  HCAT 290 Changes in HBase maven objects breaks hcat build (thw via gates)

  HCAT 280 part file name prefix with attempxxxx (daijy via gates)

  HCAT-275 JSON SerDe issues (khorgath via gates)

  HCAT-278 When outputSchema doesn't match table schema wrong columns are returned to the user (gates)

  HCAT-276 After merging in HCATALOG-237 related changes Pig scripts with more than one store fail (daijy and mithun via gates)

  HCAT-257 e2e harness not working properly after file location change (gates)

  HCAT-270 HCatRecord SerDe does not handle List<Map> or List<List> or List<lazy primitive> correctly (khorgath via gates)

  HCAT-248 Set execute.setugi conf variable to true by default (hashutosh via gates)

  HCAT-254. Fix storage-drives build.xml (hashutosh via khorgath)

Release 0.3.0 - Unreleased

  INCOMPATIBLE CHANGES

  NEW FEATURES
  HCAT-208. mapred HCatInputFormat/HCatOutputFomat changes to make it work from hive (khorgath via gates)

  HCAT-207. Changes to current HCat subsystem to allow it to work with hive (khorgath via gates)

  HCAT-204. HCatRecord SerDe (khorgath via gates)

  HCAT-192. HBase output storage driver integration with zookeeper based revision manager (toffer via hashutosh) 

  HCAT-191. HBase input storage driver integration with zookeeper based revision manager. (avandana via toffer)

  HCAT-193. Snapshot class for HCatalog tables. (avandana via toffer)

  HCAT-87. Newly added partition should inherit table properties. (hashutosh at HIVE-2589 via khorgath)

  HCAT-189. Zookpeeper based revision manager for HBase Storage Driver (avandana via toffer)

  HCAT-145. Add support for binary data type (hashutosh)  

  HCAT-151. Fixed native table names used for tables stored in non-default DBs in HBaseInputStorageDriver (avandana via toffer)

  HCAT-143. Projection pushdown for HBaseInputStorageDriver (avandana via toffer)

  HCAT-121. TextStorageOutputDriver for Pig (daijyc via hashutosh)  

  HCAT-129. HBase Storage Driver Test doesn't use unique test dir for warehouse (toffer via khorgath)

  HCAT-109. HBase Storage Handler for HCatalog (avandana via khorgath)

  HCAT-119. Output Storage Driver for HBase (Bulk) and HBaseStorageDriver Composite class (toffer via khorgath)

  HCAT-75. Input storage driver for HBase (avandana via khorgath)

  HCAT-73. Output Storage Driver for HBase (Direct PUTs) (toffer via khorgath)

  HCAT-74. ResultConverter for HBase Storage Drivers (avandana via khorgath)

  HCAT-89. Support for creating non-native tables (avandana via gates)

  HCAT-60. Refactor HCatalog to support non-filebased outputformats (toffer via gates)

  HCAT-63. RPM package integration with Hadoop (khorgath via hashutosh)

  IMPROVEMENTS
  HCAT-238. Absence of msgbus.topic.name should not be deemed as notification-failure. (mithun via gates)

  HCAT-246. Exception masked in HCatSplit class (avandana via toffer)

  HCAT-211. Update tar ball installation documentation (vikram.dixit via khorgath)

  HCAT-219. Adding HBase e2e tests (daijy via toffer) 

  HCAT-226. HBase storage drivers should load hbase resources (hbase-site, hbase-default) for the user (hashutosh via toffer)

  HCAT-223. Include HWI (vikram.dixit via khorgath)

  HCAT-166. Making configuration/installation automatable (vikram.dixit via khorgath)

  HCAT-179. Make HCatalog compile against Hadoop 0.23 (thw via khorgath)



  HCAT-184. Optionally do not generate forrest docs (traviscrawford via hashutosh)

  HCAT-187. HCatalog release missing Hive builtins (traviscrawford via hashutosh)

  HCAT-186. Downgrade ivy to 2.1.0 (currently 2.2.0) per HIVE-2580 (traviscrawford via hashutosh)

  HCAT-10. Shouldn't assume the secure hadoop installation (julienledem via hashutosh)

  HCAT-172. End-to-end test framework for HCatalog (daijyc via hashutosh)

  HCAT-158. Update HAR support to work with Hadoop 205 (thw via hashutosh)

  HCAT-111. Issues with install instructions and release notes in release candidate (gates via hashutosh)

  HCAT-103. Update documentation after rpm changes per HCATALOG-63 (khorgath via hashutosh)

  HCAT-99. HCatalog V2 Docs (chandec via hashutosh)  

  HCAT-84. Incorrect or missing SVN property settings (sebb via hashutosh)  

  HCAT-97. Make test harness work with secure cluster (hashutosh)

  HCAT-94. Handle the job tracker tokens properly in har jobs (khorgath via hashutosh)

  HCAT-43. hcat.sh does not pick up hcatalog.jar correctly (macyang via hashutosh)
  
  HCAT-91. hcat client not setting the config properly (hashutosh)

  HCAT-67. Utilities for system testing (hashutosh)
 
  HCAT-64. Refactor HCatTableInfo, JobInfo and OutputJobInfo (toffer via gates)

  HCAT-118. HIVE_CONF_DIR needs to be set to run hive (khorgath)

  HCAT-101. storage driver and hbase build scripts (toffer via khorgath)

  OPTIMIZATIONS

  BUG FIXES
  HCAT-254. Fix storage-drives build.xml (hashutosh via khorgath)

  HCAT-232. Dynamic Partitioning broken: keys set to HIVE_DEFAULT_PARTITION (mithun via gates)

  HCAT-229. bin/hcat should put hcatalog.jar into classpath (daiky via gates)

  HCAT-234. bin/hcat need to add hbase-site.xml in classpath (daijy via toffer)

  HCAT-212. hcat trunk version should be updated (hashutosh)

  HCAT-230. Remove log4j compilation dependencies (enis via hashutosh)

  HCAT-227. NPE on HBaseInputStorageDriver when table contains a CF that's never been successfully written to (toffer via hashutosh)

  HCAT-224. hcatalog e2e tests have the hive version hard coded we should read that from the hive build.properties (Arpit Gupta via hashutosh)

  HCAT-225. Fix trunk compile issue, method signature change in thrift client. (hashutosh via toffer)

  HCAT-216. we should source hcat-env.sh in hcat-config before we determine where hadoop is (arpitgupta via khorgath)

  HCAT-213. determine HIVE_CONF_DIR in hive-config.sh based on rpm or tar ball installs (arpitgupta via khorgath)

  HCAT-214. HCat commandline does not set location for config dir correctly (khorgath)

  HCAT-197. data generator for e2e assumes hadoop tarball installation (arpitgupta via khorgath)  

  HCAT-199. HCatOutputCommitter::cleanupJob() fails : Unable to connect to metastore. (mithun via khorgath)

  HCAT-197. data generator for e2e assumes hadoop tarball installation (arpitgupta via hashutosh)  

  HCAT-202. ant clean target is failing (thw via hashutosh)

  HCAT-200. e2e test build.xml does not work with rpms (arpitgupta via khorgath)

  HCAT-198. A few issues keep e2e tests from running in an automated environment (gates)

  HCAT-197. Data generator for e2e assumes hadoop tarball installation (daijy via khorgath)

  HCAT-196. Remove dependency on pig.jar for hcatalog server (daijy via khorgath)

  HCAT-195. New storage-drivers directory not picked up in src-release target (gates via khorgath)

  HCAT-171. HBaseBulkOutputStorageDriver should work with secured hadoop (toffer via khorgath)

  HCAT-170. HBaseBulkOSD fails to launch ImportSequenceFile because of missing jars in dist cache (toffer via khorgath)

  HCAT-176. Class not found exception when running TestPigStorageDriver (daijy via khorgath)

  HCAT-175. HCat fail to build on trunk (daijy via khorgath)

  HCAT-173. Make StorerInfo class public (toffer via khorgath)

  HCAT-169. Creating a table with HCatStorageHandler does not correctly store the hcat.isd and hcat.osd names (avandana via toffer)

  HCAT-160. HBaseDirectOutputStorageDriver outputVersion isn't consitent within the same MR job (toffer via hashutosh)

  HCAT-155. HBase bulkOSD requires value to be Put rather than HCatRecord (toffer via hashutosh) 

  HCAT-157. HBaseOutputFormat assumes hbase table name is hcat table name (toffer via hashutosh) 
 
  HCAT-154. HBase bulkOSD and directOSD return inconsistent path for getOutputLocation() (toffer via hashutosh)

  HCAT-124. null pointer execption on 'use no_such_db' (hashutosh)

  HCAT-125. HCat doesn't support hive's describe database DDL (hashutosh)

  HCAT-159. Build broken by recent Hive changes that move around jar files  part-2 (thw via hashutosh)

  HCAT-159. Build broken by recent Hive changes that move around jar files (gates)

  HCAT-148. Meaningful error message on failure to resolve topic name for partition event (thw via hashutosh)

  HCAT-136. Pig storer for export/import does maintain partition order (n_krishna_kumar via khorgath)

  HCAT-134. Fix hbase build.xml to not affect root package target (khorgath via hashutosh)  

  HCAT-133. HCatOutpFormat always pass url as null while trying to create a metastore client (khorgath via hashutosh)  

  HCAT-117. Harness incorrectly assumes secure mode (khorgath via hashutosh) 

  HCAT-113. rpm name not properly reflecting the version number (gates via hashutosh)

  HCAT-112. install scripts assumes bash shell but don't set it explictly (hashutosh)

  HCAT-100. Change references of hcat.sh to hcat in test harness (hashutosh)

  HCAT-78. Update notice.txt and headers and add Disclaimer.txt (hashutosh and gates via gates)

  HCAT-114. README.txt has duplicate info (ctdean via khorgath)

  HCAT-115. Superfluous warning on fresh install (ctdean via khorgath)

Release 0.2.0 - October 2, 2011

  INCOMPATIBLE CHANGES

  NEW FEATURES
    HCAT-42. Storing across partitions(Dynamic Partitioning) from HCatStorer/HCatOutputFormat (khorgath)
 
    HCAT-46. Send a message on a message bus when a partition is marked done (hashutosh via macyang)

    HCAT-2. Send a message on a message bus when events occur in Metastore (hashutosh)
  
    HCAT-16. Add InputFormat/OutputFormat for handling exported tables/partitions.
    (Krishna Kumar via macyang)
    
  IMPROVEMENTS
    HCAT-153. More comprehensive documentation for notification

    HCAT-150. Updated documentation specifying the need to call HCatOutputFormat.setSchema() (chandec via toffer)

    HCAT-107. Better documentation for "hive.metastore.warehouse.dir" config (chandec via toffer) 

    HCAT-66. HCatalog 0.2.0 Documentation (chandec via hashutosh)

    HCAT-54. Javadoc is not being built as part of HCatalog docs (hashutosh) 

    HCAT-35. HCatalog fails to compile with Pig 0.9 (hashutosh)

    HCAT-47. Topic prefix for the message bus should be configurable (hashutosh)

    HCAT-39. Lazily create connection for Message bus (hashutosh)

    HCAT-44. Add a releaseaudit target to build.xml (gates)

    HCAT-40. Remove dependencies from the HCatalog client jar (macyang)

    HCAT-37. Misc. build.xml changes (macyang via hashutosh)
  
    HCAT-27. Start and stop scripts for the server (gates)

    HCAT-21. Install documenation and script (gates)

    HCAT-34. Add ant target for server side classes (hashutosh)
    
    HCAT-33. minor changes to the test target in build.xml (macyang via hashutosh)
 
    HCAT-30. Need changes.txt (Jakob Homan via hashutosh)
  
    HCAT-19. Enable and add decorators for the export/import cli commands 
    for authorization and permission setting. (Krishna Kumar via macyang)

    HCAT-18. Refactor TestRCFileInputStorageDriver. (Jakob Homan via hashutosh)

  OPTIMIZATIONS

  BUG FIXES
    HCAT-110. Fix source target (khorgath via hashutosh)

    HCAT-53. HCatLoader, HCatStorer, HCatInputFormat, and HCatOutputFormat assume Hadoop 
             running in secure mode (hashutosh)
 
    HCAT-57. Remove usage of deprecated methods (hashutosh)
   
    HCAT-59. Assimilate new changes in listener interface (hashutosh)
    
    HCAT-55. HCatalog distribution missing a few required jars (gates)

    HCAT-52. No message is sent on message bus in case partition keys are uppercase (hashutosh)

    HCAT-45. HCatalog release tar ball source code has problems (gates)

    HCAT-41. Changes to hcat.sh in HCATALOG-20 broke the -e option (gates)

    HCAT-12. Get trunk to build. (hashutosh)

    HCAT-17. Shouldn't be able to add an HCatFieldSchema with the same name as 
    existing field. (Jakob Homan via gates)

    HCAT-28. Trunk test not compiling: Upstream Hive changes broke TestPermsGrp.
    (Jakob Homan via hashutosh)

    HCAT-15. Replace all occurrences of 'howl' with hcat/hcatalog. 
    (Jakob Homan via macyang)

Release 0.1 - Never released

  INCOMPATIBLE CHANGES

  NEW FEATURES
    HCAT-1. Upload initial code to HCatalog (gates)

    HCAT-4. Get the build working for HCatalog. (gates)

    HCAT-9. Get a beginning HCatalog website up. (gates)

  IMPROVEMENTS

    HCAT-29. Remove Yahoo copyright from documentation (Jakob Homan via hashutosh)
  
  OPTIMIZATIONS

  BUG FIXES
    HCAT-7. Ivy fetch of CDH Hadoop versions does not work properly. (gates)

    HCAT-6. Unit test TestPermsInheritance fails. (hashutosh)
