Author: brandonwilliams Date: Fri Jul 15 17:33:50 2011 New Revision: 1147259
URL: http://svn.apache.org/viewvc?rev=1147259&view=rev Log: Proper function support and key validation for cli deletes. Patch by Pavel Yaskevich, reviewed by brandonwilliams for CASSANDRA-2821 Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cli/CliClient.java cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cli/CliTest.java Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cli/CliClient.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cli/CliClient.java?rev=1147259&r1=1147258&r2=1147259&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cli/CliClient.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cli/CliClient.java Fri Jul 15 17:33:50 2011 @@ -376,13 +376,14 @@ public class CliClient Tree columnFamilySpec = statement.getChild(0); - String key = CliCompiler.getKey(columnFamilySpec); String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, keyspacesMap.get(keySpace).cf_defs); + CfDef cfDef = getCfDef(columnFamily); + + ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1)); int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec); byte[] superColumnName = null; byte[] columnName = null; - CfDef cfDef = getCfDef(columnFamily); boolean isSuper = cfDef.column_type.equals("Super"); if ((columnSpecCnt < 0) || (columnSpecCnt > 2)) @@ -390,20 +391,42 @@ public class CliClient sessionState.out.println("Invalid row, super column, or column specification."); return; } - + + Tree columnTree = (columnSpecCnt >= 1) + ? columnFamilySpec.getChild(2) + : null; + + Tree subColumnTree = (columnSpecCnt == 2) + ? columnFamilySpec.getChild(3) + : null; + if (columnSpecCnt == 1) { + assert columnTree != null; + + byte[] columnNameBytes = (columnTree.getType() == CliParser.FUNCTION_CALL) + ? convertValueByFunction(columnTree, null, null).array() + : columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef); + // table.cf['key']['column'] if (isSuper) - superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef); + superColumnName = columnNameBytes; else - columnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef); + columnName = columnNameBytes; } else if (columnSpecCnt == 2) { + assert columnTree != null; + assert subColumnTree != null; + // table.cf['key']['column']['column'] - superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef); - columnName = subColumnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 1), cfDef); + superColumnName = (columnTree.getType() == CliParser.FUNCTION_CALL) + ? convertValueByFunction(columnTree, null, null).array() + : columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef); + + columnName = (subColumnTree.getType() == CliParser.FUNCTION_CALL) + ? convertValueByFunction(subColumnTree, null, null).array() + : subColumnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 1), cfDef); } ColumnPath path = new ColumnPath(columnFamily); @@ -415,12 +438,11 @@ public class CliClient if (isCounterCF(cfDef)) { - thriftClient.remove_counter(ByteBufferUtil.bytes(key), path, consistencyLevel); + thriftClient.remove_counter(key, path, consistencyLevel); } else { - thriftClient.remove(ByteBufferUtil.bytes(key), path, - FBUtilities.timestampMicros(), consistencyLevel); + thriftClient.remove(key, path, FBUtilities.timestampMicros(), consistencyLevel); } sessionState.out.println(String.format("%s removed.", (columnSpecCnt == 0) ? "row" : "column")); } Modified: cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cli/CliTest.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cli/CliTest.java?rev=1147259&r1=1147258&r2=1147259&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cli/CliTest.java (original) +++ cassandra/branches/cassandra-0.8/test/unit/org/apache/cassandra/cli/CliTest.java Fri Jul 15 17:33:50 2011 @@ -54,6 +54,8 @@ public class CliTest extends CleanupHelp "get CF1 where world2 = long(15);", "get cF1 where world2 = long(15);", "get Cf1 where world2 = long(15);", + "del CF1[utf8('hello')][utf8('world')];", + "del CF1[hello][world2];", "set CF1['hello'][time_spent_uuid] = timeuuid(a8098c1a-f86e-11da-bd1a-00112444be1e);", "create column family CF2 with comparator=IntegerType;", "assume CF2 keys as utf8;",