/* * Copyright 2012 NGDATA nv * * Licensed 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.lilyproject.util.hbase; import org.apache.hadoop.hbase.util.Bytes; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class TableConfig { private byte[][] splitKeys; private Long maxFileSize; private Long memStoreFlushSize; private Map<String, ColumnFamilyConfig> columnFamilies = new HashMap<String, ColumnFamilyConfig>(); public TableConfig() { } public TableConfig(byte[][] splitKeys) { this.splitKeys = splitKeys; } public Map<String, ColumnFamilyConfig> getColumnFamilies() { return columnFamilies; } public ColumnFamilyConfig getColumnFamilyConfig(String family) { return columnFamilies.containsKey(family) ? columnFamilies.get(family) : new ColumnFamilyConfig(); } public Long getMaxFileSize() { return maxFileSize; } public void setMaxFileSize(Long maxFileSize) { this.maxFileSize = maxFileSize; } public Long getMemStoreFlushSize() { return memStoreFlushSize; } public void setMemStoreFlushSize(Long memStoreFlushSize) { this.memStoreFlushSize = memStoreFlushSize; } public byte[][] getSplitKeys() { return splitKeys; } /** * @param regionCount (optional, can be null) number of regions. Creates splits suited for row keys that are * random UUIDs. * @param splitKeysAsString (optional, can be null) comma-separated list of split keys. If this is specified, it takes */ public static byte[][] parseSplitKeys(Integer regionCount, String splitKeysAsString, String splitKeyPrefixAsString) { byte[] splitKeyPrefix = splitKeyPrefixAsString != null ? Bytes.toBytesBinary(splitKeyPrefixAsString) : new byte[0]; byte[][] splitKeys = null; if (splitKeysAsString != null && !splitKeysAsString.isEmpty()) { String[] split = splitKeysAsString.split(","); splitKeys = new byte[split.length][]; for (int i = 0; i < split.length; i++) { splitKeys[i] = Bytes.add(splitKeyPrefix, Bytes.toBytesBinary(split[i])); } } else if (regionCount != null && regionCount <= 1) { // one region requested, no need to define splits } else if (regionCount != null) { byte[] startBytes = splitKeyPrefix.length > 0 ? splitKeyPrefix : new byte[]{(byte)0}; byte[] endBytes = new byte[splitKeyPrefix.length + 16]; System.arraycopy(splitKeyPrefix, 0, endBytes, 0, splitKeyPrefix.length); for (int i = splitKeyPrefix.length; i < endBytes.length; i++) { endBytes[i] = (byte)0xFF; } // number of splits = number of regions - 1 splitKeys = Bytes.split(startBytes, endBytes, regionCount - 1); // Stripping the first key to avoid a region [null,0[ which will always be empty // And the last key to avoid [xffxffxff....,null[ to contain only few values if variants are created // for a record with record id xffxffxff..... splitKeys = Arrays.copyOfRange(splitKeys, 1, splitKeys.length - 1); } return splitKeys; } }