blob: b16fe6dc3152286bdf3849e88dbb25c66d61f14d [file] [log] [blame]
/*
* 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.
*/
package org.apache.fluo.accumulo.util;
import com.google.common.base.Preconditions;
import org.apache.accumulo.core.data.Key;
/**
* Abstracts how the Fluo column type is encoded in Accumulo timestamps.
*/
public enum ColumnType {
TX_DONE, WRITE, DEL_LOCK, RLOCK, LOCK, ACK, DATA;
private long prefix;
/**
* @return The first possible timestamp in sorted order.
*/
public long first() {
return prefix | ColumnConstants.TIMESTAMP_MASK;
}
/**
* @return The timestamp with this column type encoded into the high order bits.
*/
public long enode(long timestamp) {
Preconditions.checkArgument((timestamp >>> (64 - BITS)) == 0);
return prefix | timestamp;
}
// The number of leftmost bits in in the timestamp reserved for encoding the column type
static final int BITS = 3;
private static final byte TX_DONE_PREFIX = 0x03;
private static final byte WRITE_PREFIX = 0x02;
private static final byte DEL_LOCK_PREFIX = 0x01;
private static final byte RLOCK_PREFIX = 0x00;
private static final byte LOCK_PREFIX = 0x07;
private static final byte ACK_PREFIX = 0x06;
private static final byte DATA_PREFIX = 0x05;
static {
TX_DONE.prefix = (long) TX_DONE_PREFIX << (64 - BITS);
WRITE.prefix = (long) WRITE_PREFIX << (64 - BITS);
DEL_LOCK.prefix = (long) DEL_LOCK_PREFIX << (64 - BITS);
RLOCK.prefix = (long) RLOCK_PREFIX << (64 - BITS);
LOCK.prefix = (long) LOCK_PREFIX << (64 - BITS);
ACK.prefix = (long) ACK_PREFIX << (64 - BITS);
DATA.prefix = (long) DATA_PREFIX << (64 - BITS);
}
public static ColumnType from(Key k) {
return from(k.getTimestamp());
}
public static ColumnType from(long timestamp) {
byte prefix = (byte) (timestamp >>> (64 - BITS));
switch (prefix) {
case TX_DONE_PREFIX:
return TX_DONE;
case WRITE_PREFIX:
return WRITE;
case DEL_LOCK_PREFIX:
return DEL_LOCK;
case RLOCK_PREFIX:
return RLOCK;
case LOCK_PREFIX:
return LOCK;
case ACK_PREFIX:
return ACK;
case DATA_PREFIX:
return DATA;
default:
throw new IllegalArgumentException("Unknown prefix : " + Integer.toHexString(prefix));
}
}
}