Author: jbellis
Date: Tue Nov 23 15:47:48 2010
New Revision: 1038171
URL: http://svn.apache.org/viewvc?rev=1038171&view=rev
Log:
add AbstractType.fromString
patch by Pavel Yaskevich; reviewed by jbellis for CASSANDRA-1767
Modified:
cassandra/branches/cassandra-0.7/CHANGES.txt
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AbstractType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/BytesType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/IntegerType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LexicalUUIDType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LongType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Tue Nov 23 15:47:48 2010
@@ -4,6 +4,7 @@ dev
* rename o.a.c.internal.AntientropyStage -> AntiEntropyStage,
o.a.c.request.Request_responseStage -> RequestResponseStage,
o.a.c.internal.Internal_responseStage -> InternalResponseStage
+ * add AbstractType.fromString (CASSANDRA-1767)
0.7.0-rc1
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
Tue Nov 23 15:47:48 2010
@@ -1437,63 +1437,10 @@ public class CliClient extends CliUserHe
*/
private ByteBuffer getBytesAccordingToType(String object, AbstractType
comparator)
{
- // TODO there is tension here between using this function to generate
default values,
- // and using it to parse input. For instance, normally we want to
convert empty string
- // to empty byte array for any type -- all types special case empty
byte[] to mean
- // "minimum value" -- but we also want timeuuid() to create a valid
uuid for us.
- // For now, this function takes the create-valid-values approach, and
we leave
- // other use cases to special case "" -> byte[0] before calling this.
- if (comparator instanceof LongType)
- {
- long longType;
- try
- {
- longType = Long.valueOf(object);
- }
- catch (Exception e)
- {
- throw new RuntimeException("'" + object + "' could not be
translated into a LongType.");
- }
-
- return FBUtilities.toByteBuffer(longType);
- }
- else if (comparator instanceof LexicalUUIDType || comparator
instanceof TimeUUIDType)
- {
- // generate new time based UUID if object is empty
- // this means that we have timeuuid() call
- if (comparator instanceof TimeUUIDType && object.isEmpty())
- return
ByteBuffer.wrap(UUIDGenerator.getInstance().generateTimeBasedUUID().asByteArray());
-
- UUID uuid = (object.isEmpty()) ? UUID.randomUUID() :
UUID.fromString(object);
-
- if (comparator instanceof TimeUUIDType && uuid.version() != 1)
- throw new IllegalArgumentException("TimeUUID supports only
version 1 UUIDs");
+ if (comparator == null) // default comparator is BytesType
+ comparator = BytesType.instance;
- return ByteBuffer.wrap(UUIDGen.decompose(uuid));
- }
- else if (comparator instanceof IntegerType)
- {
- BigInteger integerType;
-
- try
- {
- integerType = new BigInteger(object);
- }
- catch (Exception e)
- {
- throw new RuntimeException("'" + object + "' could not be
translated into an IntegerType.");
- }
-
- return ByteBuffer.wrap(integerType.toByteArray());
- }
- else if (comparator instanceof AsciiType)
- {
- return ByteBuffer.wrap(object.getBytes(Charsets.US_ASCII));
- }
- else
- {
- return ByteBuffer.wrap(object.getBytes(Charsets.UTF_8));
- }
+ return comparator.fromString(object);
}
/**
@@ -1592,7 +1539,7 @@ public class CliClient extends CliUserHe
* @param columnName - column name to which value belongs
* @param columnFamilyName - column family name
* @param columnValue - actual column value
- * @return byte[] - value in byte array representation
+ * @return value in byte array representation
*/
private ByteBuffer columnValueAsBytes(ByteBuffer columnName, String
columnFamilyName, String columnValue)
{
@@ -1602,7 +1549,7 @@ public class CliClient extends CliUserHe
{
byte[] currentColumnName = columnDefinition.getName();
- if (ByteBufferUtil.compare(currentColumnName,columnName)==0)
+ if (ByteBufferUtil.compare(currentColumnName, columnName) == 0)
{
try
{
@@ -1710,7 +1657,32 @@ public class CliClient extends CliUserHe
try
{
- ByteBuffer value = getBytesAccordingToType(functionArg, validator);
+
+ ByteBuffer value;
+
+ if (functionArg.isEmpty())
+ {
+ if (validator instanceof TimeUUIDType)
+ {
+ value =
ByteBuffer.wrap(UUIDGenerator.getInstance().generateTimeBasedUUID().asByteArray());
+ }
+ else if (validator instanceof LexicalUUIDType)
+ {
+ value =
ByteBuffer.wrap(UUIDGen.decompose(UUID.randomUUID()));
+ }
+ else if (validator instanceof BytesType)
+ {
+ value = ByteBuffer.wrap(new byte[0]);
+ }
+ else
+ {
+ throw new RuntimeException(String.format("Argument for
'%s' could not be empty.", functionName));
+ }
+ }
+ else
+ {
+ value = getBytesAccordingToType(functionArg, validator);
+ }
// performing ColumnDef local validator update
if (withUpdate)
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AbstractType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AbstractType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AbstractType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AbstractType.java
Tue Nov 23 15:47:48 2010
@@ -40,7 +40,14 @@ public abstract class AbstractType imple
/** get a string representation of the bytes suitable for log messages */
public abstract String getString(ByteBuffer bytes);
- /** validate that the byte array is a valid sequence for the type we are
supposed to be comparing */
+ /** get a byte representation of the given string.
+ * defaults to unsupportedoperation so people deploying custom Types can
update at their leisure. */
+ public ByteBuffer fromString(String source)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ /* validate that the byte array is a valid sequence for the type we are
supposed to be comparing */
public void validate(ByteBuffer bytes)
{
getString(bytes);
@@ -66,7 +73,7 @@ public abstract class AbstractType imple
};
}
- /** convenience method */
+ /* convenience method */
public String getString(Collection<ByteBuffer> names)
{
StringBuilder builder = new StringBuilder();
@@ -77,7 +84,7 @@ public abstract class AbstractType imple
return builder.toString();
}
- /** convenience method */
+ /* convenience method */
public String getColumnsString(Collection<IColumn> columns)
{
StringBuilder builder = new StringBuilder();
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java
Tue Nov 23 15:47:48 2010
@@ -38,4 +38,9 @@ public class AsciiType extends BytesType
{
return ByteBufferUtil.string(bytes, Charsets.US_ASCII);
}
+
+ public ByteBuffer fromString(String source)
+ {
+ return ByteBuffer.wrap(source.getBytes(Charsets.US_ASCII));
+ }
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/BytesType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/BytesType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/BytesType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/BytesType.java
Tue Nov 23 15:47:48 2010
@@ -46,4 +46,9 @@ public class BytesType extends AbstractT
{
return FBUtilities.bytesToHex(bytes);
}
+
+ public ByteBuffer fromString(String source)
+ {
+ return ByteBuffer.wrap(source.getBytes());
+ }
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/IntegerType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/IntegerType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/IntegerType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/IntegerType.java
Tue Nov 23 15:47:48 2010
@@ -19,6 +19,7 @@
package org.apache.cassandra.db.marshal;
+import java.math.BigInteger;
import java.nio.ByteBuffer;
import org.apache.thrift.TBaseHelper;
@@ -122,4 +123,20 @@ public final class IntegerType extends A
return new
java.math.BigInteger(TBaseHelper.byteBufferToByteArray(bytes)).toString(10);
}
+
+ public ByteBuffer fromString(String source)
+ {
+ BigInteger integerType;
+
+ try
+ {
+ integerType = new BigInteger(source);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("'" + source + "' could not be
translated into an IntegerType.");
+ }
+
+ return ByteBuffer.wrap(integerType.toByteArray());
+ }
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LexicalUUIDType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LexicalUUIDType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LexicalUUIDType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LexicalUUIDType.java
Tue Nov 23 15:47:48 2010
@@ -22,6 +22,7 @@ package org.apache.cassandra.db.marshal;
import java.nio.ByteBuffer;
+import java.util.UUID;
import org.apache.cassandra.utils.UUIDGen;
@@ -57,4 +58,9 @@ public class LexicalUUIDType extends Abs
}
return UUIDGen.getUUID(bytes).toString();
}
+
+ public ByteBuffer fromString(String source)
+ {
+ return ByteBuffer.wrap(UUIDGen.decompose(UUID.fromString(source)));
+ }
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java
Tue Nov 23 15:47:48 2010
@@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.utils.FBUtilities;
+import org.apache.commons.lang.NotImplementedException;
/** for sorting columns representing row keys in the row ordering as
determined by a partitioner.
* Not intended for user-defined CFs, and will in fact error out if used with
such. */
@@ -41,6 +42,11 @@ public class LocalByPartionerType<T exte
return FBUtilities.bytesToHex(bytes);
}
+ public ByteBuffer fromString(String source)
+ {
+ throw new NotImplementedException();
+ }
+
public int compare(ByteBuffer o1, ByteBuffer o2)
{
return
partitioner.decorateKey(o1).compareTo(partitioner.decorateKey(o2));
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LongType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LongType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LongType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/LongType.java
Tue Nov 23 15:47:48 2010
@@ -24,6 +24,7 @@ package org.apache.cassandra.db.marshal;
import java.nio.ByteBuffer;
import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
public class LongType extends AbstractType
{
@@ -64,4 +65,20 @@ public class LongType extends AbstractTy
return
String.valueOf(bytes.getLong(bytes.position()+bytes.arrayOffset()));
}
+
+ public ByteBuffer fromString(String source)
+ {
+ long longType;
+
+ try
+ {
+ longType = Long.valueOf(source);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("'" + source + "' could not be
translated into a LongType.");
+ }
+
+ return FBUtilities.toByteBuffer(longType);
+ }
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
Tue Nov 23 15:47:48 2010
@@ -25,6 +25,7 @@ import java.nio.ByteBuffer;
import java.util.UUID;
import org.apache.cassandra.utils.UUIDGen;
+import org.safehaus.uuid.UUIDGenerator;
public class TimeUUIDType extends AbstractType
{
@@ -87,4 +88,14 @@ public class TimeUUIDType extends Abstra
}
return uuid.toString();
}
+
+ public ByteBuffer fromString(String source)
+ {
+ UUID uuid = UUID.fromString(source);
+
+ if (uuid.version() != 1)
+ throw new IllegalArgumentException("TimeUUID supports only version
1 UUIDs");
+
+ return ByteBuffer.wrap(UUIDGen.decompose(uuid));
+ }
}
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java?rev=1038171&r1=1038170&r2=1038171&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
Tue Nov 23 15:47:48 2010
@@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.util.Arrays;
+import com.google.common.base.Charsets;
import org.apache.cassandra.utils.FBUtilities;
public class UTF8Type extends BytesType
@@ -43,4 +44,9 @@ public class UTF8Type extends BytesType
throw new MarshalException("invalid UTF8 bytes " +
Arrays.toString(bytes.array()));
}
}
+
+ public ByteBuffer fromString(String source)
+ {
+ return ByteBuffer.wrap(source.getBytes(Charsets.UTF_8));
+ }
}