Index: bin/HBase.rb =================================================================== --- bin/HBase.rb (revision 697969) +++ bin/HBase.rb (working copy) @@ -7,6 +7,9 @@ # For example, the exists method on Admin class prints to the formatter # whether the table exists and returns nil regardless. include Java +include_class('java.lang.Integer') {|package,name| "J#{name}" } +include_class('java.lang.Boolean') {|package,name| "J#{name}" } + import org.apache.hadoop.hbase.client.HBaseAdmin import org.apache.hadoop.hbase.client.HTable import org.apache.hadoop.hbase.HConstants @@ -30,6 +33,7 @@ STARTROW = "STARTROW" ENDROW = STOPROW LIMIT = "LIMIT" + METHOD = "METHOD" # Wrapper for org.apache.hadoop.hbase.client.HBaseAdmin class Admin @@ -123,11 +127,22 @@ end def alter(tableName, args) - now = Time.now + now = Time.now raise TypeError.new("Table name must be of type String") \ unless tableName.instance_of? String - descriptor = hcd(args) - @admin.modifyColumn(tableName, descriptor.getNameAsString(), descriptor); + htd = @admin.getTableDescriptor(tableName.to_java_bytes) + method = args.delete(METHOD) + if method == "delete" + @admin.deleteColumn(tableName, makeColumnName(args[NAME])) + else + descriptor = hcd(args) + if (htd.hasFamily(descriptor.getNameAsString().to_java_bytes)) + @admin.modifyColumn(tableName, descriptor.getNameAsString(), + descriptor); + else + @admin.addColumn(tableName, descriptor); + end + end @formatter.header() @formatter.footer(now) end @@ -160,14 +175,14 @@ # TODO: What encoding are Strings in jruby? return HColumnDescriptor.new(name.to_java_bytes, # JRuby uses longs for ints. Need to convert. Also constants are String - arg[VERSIONS]? arg[VERSIONS]: HColumnDescriptor::DEFAULT_VERSIONS, + arg[VERSIONS]? JInteger.new(arg[VERSIONS]): HColumnDescriptor::DEFAULT_VERSIONS, arg[HColumnDescriptor::COMPRESSION]? HColumnDescriptor::CompressionType::valueOf(arg[HColumnDescriptor::COMPRESSION]): HColumnDescriptor::DEFAULT_COMPRESSION, - arg[IN_MEMORY]? arg[IN_MEMORY]: HColumnDescriptor::DEFAULT_IN_MEMORY, - arg[HColumnDescriptor::BLOCKCACHE]? arg[HColumnDescriptor::BLOCKCACHE]: HColumnDescriptor::DEFAULT_BLOCKCACHE, - arg[HColumnDescriptor::LENGTH]? arg[HColumnDescriptor::LENGTH]: HColumnDescriptor::DEFAULT_LENGTH, - arg[HColumnDescriptor::TTL]? arg[HColumnDescriptor::TTL]: HColumnDescriptor::DEFAULT_TTL, - arg[HColumnDescriptor::BLOOMFILTER]? arg[HColumnDescriptor::BLOOMFILTER]: HColumnDescriptor::DEFAULT_BLOOMFILTER) + arg[IN_MEMORY]? JBoolean.valueOf(arg[IN_MEMORY]): HColumnDescriptor::DEFAULT_IN_MEMORY, + arg[HColumnDescriptor::BLOCKCACHE]? JBoolean.valueOf(arg[HColumnDescriptor::BLOCKCACHE]): HColumnDescriptor::DEFAULT_BLOCKCACHE, + arg[HColumnDescriptor::LENGTH]? JInteger.new(arg[HColumnDescriptor::LENGTH]): HColumnDescriptor::DEFAULT_LENGTH, + arg[HColumnDescriptor::TTL]? JInteger.new(arg[HColumnDescriptor::TTL]): HColumnDescriptor::DEFAULT_TTL, + arg[HColumnDescriptor::BLOOMFILTER]? JBoolean.valueOf(arg[HColumnDescriptor::BLOOMFILTER]): HColumnDescriptor::DEFAULT_BLOOMFILTER) end end