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));
+    }
 }


Reply via email to