diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java index e888e6a..cb5d10a 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java @@ -102,6 +102,18 @@ public class HColumnDescriptor implements WritableComparable public static final String ENCRYPTION_KEY = "ENCRYPTION_KEY"; /** + * TTL related constat for human readable representation + */ + + public static final Long SECONDS_PER_DAY = 86400L; + + public enum Unit { + TIME_INTERVAL, + NONE + } + + + /** * Default compression type. */ public static final String DEFAULT_COMPRESSION = @@ -929,6 +941,7 @@ public class HColumnDescriptor implements WritableComparable @Override public String toString() { StringBuilder s = new StringBuilder(); + s.append('{'); s.append(HConstants.NAME); s.append(" => '"); @@ -973,7 +986,7 @@ public class HColumnDescriptor implements WritableComparable s.append(", "); s.append(key); s.append(" => "); - s.append('\'').append(value).append('\''); + s.append('\'').append(toHuman(key,value)).append('\''); } } @@ -995,7 +1008,7 @@ public class HColumnDescriptor implements WritableComparable printComma = true; s.append('\'').append(key).append('\''); s.append(" => "); - s.append('\'').append(value).append('\''); + s.append('\'').append(toHuman(key, value)).append('\''); } s.append('}'); } @@ -1010,13 +1023,62 @@ public class HColumnDescriptor implements WritableComparable printCommaForConfiguration = true; s.append('\'').append(e.getKey()).append('\''); s.append(" => "); - s.append('\'').append(e.getValue()).append('\''); + s.append('\'').append(toHuman(e.getKey(), e.getValue())).append('\''); } s.append("}"); } return s; } + private static String toHuman(final String key, final String value) { + StringBuilder human = new StringBuilder(); + switch (getUnit(key)) { + case TIME_INTERVAL: + human.append(humanReadableTTL(Long.valueOf(value))); + break; + default: + human.append(value); + } + return human.toString(); + } + + private static String humanReadableTTL(final long interval){ + StringBuilder sb = new StringBuilder(); + int days; + + days = (int) Math.floor(interval/SECONDS_PER_DAY); + + // edge cases first + if (interval == Integer.MAX_VALUE) { + sb.append("FOREVER"); + return sb.toString(); + } + if (interval < SECONDS_PER_DAY) { + sb.append(interval); + sb.append(" SECOND" + (interval == 1 ? "" : "S")); + return sb.toString(); + } + if (days > 0) { + sb.append(interval); + sb.append(" SECONDS ("); + sb.append(days); + sb.append(" DAY" + (days == 1 ? "" : "S")); + sb.append(")"); + } + return sb.toString(); + } + + private static Unit getUnit(String key) { + Unit unit; + /* TTL for now, we can add more as we neeed */ + if (key.equals(TTL)) { + unit = Unit.TIME_INTERVAL; + } else { + unit = Unit.NONE; + } + return unit; + } + public static Map getDefaultValues() { return Collections.unmodifiableMap(DEFAULT_VALUES); }