@Override protected final byte[] getSplitPoint() { return getSplitPoint(super.getSplitPoint()); } }
protected final byte[] getSplitPoint(byte[] splitPoint) { if (splitPoint==null) { return splitPoint; } int offset = SchemaUtil.getVarCharLength(splitPoint, 0, splitPoint.length, getColumnToSplitAt()); // Only split between leading columns indicated. if (offset == splitPoint.length) { return splitPoint; } // Otherwise, an attempt is being made to split in the middle of a table. // Just return a split point at the boundary of the first two columns instead byte[] newSplitPoint = new byte[offset + 1]; System.arraycopy(splitPoint, 0, newSplitPoint, 0, offset+1); return newSplitPoint; }
@Override protected boolean shouldSplit() { Configuration conf = getConf(); return super.shouldSplit() && conf.getBoolean(QueryServices.SYSTEM_CATALOG_SPLITTABLE, QueryServicesOptions.DEFAULT_SYSTEM_CATALOG_SPLITTABLE); }
@Test public void testFunctionSplitPolicy() { SplitOnLeadingVarCharColumnsPolicy policy = new SystemFunctionSplitPolicy(); byte[] splitPoint; byte[] rowKey; byte[] expectedSplitPoint; rowKey = getSystemFunctionRowKey("","MY_FUNC", "VARCHAR", Bytes.toBytes(3)); expectedSplitPoint = getSystemFunctionSplitKey("","MY_FUNC"); splitPoint = policy.getSplitPoint(rowKey); assertArrayEquals(expectedSplitPoint, splitPoint); rowKey = getSystemFunctionRowKey("TENANT1","F", "", Bytes.toBytes(3)); expectedSplitPoint = getSystemFunctionSplitKey("TENANT1","F"); splitPoint = policy.getSplitPoint(rowKey); assertArrayEquals(expectedSplitPoint, splitPoint); } }
protected final byte[] getSplitPoint(byte[] splitPoint) { int offset = SchemaUtil.getVarCharLength(splitPoint, 0, splitPoint.length, getColumnToSplitAt()); // Only split between leading columns indicated. if (offset == splitPoint.length) { return splitPoint; } // Otherwise, an attempt is being made to split in the middle of a table. // Just return a split point at the boundary of the first two columns instead byte[] newSplitPoint = new byte[offset + 1]; System.arraycopy(splitPoint, 0, newSplitPoint, 0, offset+1); return newSplitPoint; }
@Override protected boolean shouldSplit() { Configuration conf = getConf(); return super.shouldSplit() && conf.getBoolean(QueryServices.SYSTEM_CATALOG_SPLITTABLE, QueryServicesOptions.DEFAULT_SYSTEM_CATALOG_SPLITTABLE); }
@Override protected final byte[] getSplitPoint() { return getSplitPoint(super.getSplitPoint()); } }
protected final byte[] getSplitPoint(byte[] splitPoint) { if (splitPoint==null) { return splitPoint; } int offset = SchemaUtil.getVarCharLength(splitPoint, 0, splitPoint.length, getColumnToSplitAt()); // Only split between leading columns indicated. if (offset == splitPoint.length) { return splitPoint; } // Otherwise, an attempt is being made to split in the middle of a table. // Just return a split point at the boundary of the first two columns instead byte[] newSplitPoint = new byte[offset + 1]; System.arraycopy(splitPoint, 0, newSplitPoint, 0, offset+1); return newSplitPoint; }
@Override protected final byte[] getSplitPoint() { return getSplitPoint(super.getSplitPoint()); } }
@Test public void testStatsSplitPolicy() { SplitOnLeadingVarCharColumnsPolicy policy = new SystemStatsSplitPolicy(); byte[] splitOn; byte[] rowKey; byte[] table; ImmutableBytesWritable family; table = PVarchar.INSTANCE.toBytes("FOO.BAR"); family = QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES_PTR; rowKey = ByteUtil.concat( PLong.INSTANCE.toBytes(20L), PVarchar.INSTANCE.toBytes("BAS"), QueryConstants.SEPARATOR_BYTE_ARRAY, PInteger.INSTANCE.toBytes(100)); splitOn = StatisticsUtil.getRowKey(table, family, rowKey); splitOn = policy.getSplitPoint(splitOn); assertArrayEquals(ByteUtil.concat(table, QueryConstants.SEPARATOR_BYTE_ARRAY), splitOn); table = PVarchar.INSTANCE.toBytes("MY_TABLE"); family = new ImmutableBytesWritable(Bytes.toBytes("ABC")); rowKey = ByteUtil.concat( PVarchar.INSTANCE.toBytes("BAS"), QueryConstants.SEPARATOR_BYTE_ARRAY, PInteger.INSTANCE.toBytes(100), PLong.INSTANCE.toBytes(20L)); splitOn = StatisticsUtil.getRowKey(table, family, rowKey); splitOn = policy.getSplitPoint(splitOn); assertArrayEquals(ByteUtil.concat(table, QueryConstants.SEPARATOR_BYTE_ARRAY), splitOn); }