You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/06/20 18:52:10 UTC

svn commit: r1137698 - in /cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db: Table.java marshal/BooleanType.java marshal/DateType.java marshal/DoubleType.java marshal/FloatType.java

Author: jbellis
Date: Mon Jun 20 16:52:10 2011
New Revision: 1137698

URL: http://svn.apache.org/viewvc?rev=1137698&view=rev
Log:
add uncommitted files

Added:
    cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/BooleanType.java
    cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DateType.java
    cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DoubleType.java
    cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/FloatType.java
Modified:
    cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/Table.java

Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/Table.java?rev=1137698&r1=1137697&r2=1137698&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/Table.java Mon Jun 20 16:52:10 2011
@@ -489,7 +489,16 @@ public class Table
             ByteBuffer name = iter.next();
             IColumn newColumn = cf.getColumn(name); // null == row delete or it wouldn't be marked Mutated
             if (newColumn != null && cf.isMarkedForDelete())
-                throw new UnsupportedOperationException("Index manager cannot support deleting and inserting into a row in the same mutation");
+            {
+                // row is marked for delete, but column was also updated.  if column is timestamped less than
+                // the row tombstone, treat it as if it didn't exist.  Otherwise we don't care about row
+                // tombstone for the purpose of the index update and we can proceed as usual.
+                if (newColumn.timestamp() <= cf.getMarkedForDeleteAt())
+                {
+                    // don't remove from the cf object; that can race w/ CommitLog write.  Leaving it is harmless.
+                    newColumn = null;
+                }
+            }
             IColumn oldColumn = oldIndexedColumns.getColumn(name);
 
             // deletions are irrelevant to the index unless we're changing state from live -> deleted, i.e.,

Added: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/BooleanType.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/BooleanType.java?rev=1137698&view=auto
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/BooleanType.java (added)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/BooleanType.java Mon Jun 20 16:52:10 2011
@@ -0,0 +1,136 @@
+package org.apache.cassandra.db.marshal;
+/*
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ * 
+ */
+
+import java.nio.ByteBuffer;
+import java.sql.Types;
+
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+public class BooleanType extends AbstractType<Boolean>
+{
+  public static final BooleanType instance = new BooleanType();
+
+  BooleanType() {} // singleton
+
+  public Boolean compose(ByteBuffer bytes)
+  {
+      byte value = bytes.get(bytes.position());
+      return Boolean.valueOf(value ==0 ? false:true);
+  }
+
+  public ByteBuffer decompose(Boolean value)
+  {
+    return (value==null) ? ByteBufferUtil.EMPTY_BYTE_BUFFER
+                         : value ? ByteBuffer.wrap(new byte[]{1})  // true
+                                 : ByteBuffer.wrap(new byte[]{0}); // false
+  }
+  
+  public int compare(ByteBuffer o1, ByteBuffer o2)
+  {
+      if ((o1 == null) || (o1.remaining() != 1))
+        return ((o2 == null) || (o2.remaining() != 1)) ? 0 : -1;
+      if ((o2 == null) || (o2.remaining() != 1))
+        return 1;
+
+      return o1.compareTo(o2);
+  }
+
+  public String getString(ByteBuffer bytes)
+  {
+      if (bytes.remaining() == 0)
+      {
+          return Boolean.FALSE.toString();
+      }
+      if (bytes.remaining() != 1)
+      {
+          throw new MarshalException("A boolean is stored in exactly 1 byte: "+bytes.remaining());
+      }
+      byte value = bytes.get(bytes.position());
+      
+      return value ==0 ? Boolean.FALSE.toString(): Boolean.TRUE.toString();
+  }
+
+  public String toString(Boolean b)
+  {
+      return b.toString();
+  }
+
+  public ByteBuffer fromString(String source) throws MarshalException
+  {
+    
+      if (source.isEmpty()|| source.equalsIgnoreCase(Boolean.FALSE.toString()))
+          return decompose(false);
+      
+      if (source.equalsIgnoreCase(Boolean.TRUE.toString()))
+          return decompose(true);
+      
+      throw new MarshalException(String.format("unable to make boolean from '%s'", source));
+      
+ }
+
+  public void validate(ByteBuffer bytes) throws MarshalException
+  {
+      if (bytes.remaining() != 1 && bytes.remaining() != 0)
+          throw new MarshalException(String.format("Expected 1 or 0 byte value (%d)", bytes.remaining()));
+  }
+
+  public Class<Boolean> getType()
+  {
+      return Boolean.class;
+  }
+
+  public boolean isSigned()
+  {
+    return false;
+  }
+
+  public boolean isCaseSensitive()
+  {
+    return false;
+  }
+
+  public boolean isCurrency()
+  {
+    return false;
+  }
+
+  public int getPrecision(Boolean obj)
+  {
+    return -1;
+  }
+
+  public int getScale(Boolean obj)
+  {
+    return -1;
+  }
+
+  public int getJdbcType()
+  {
+    return Types.BOOLEAN;
+  }
+
+  public boolean needsQuotes()
+  {
+    return false;
+  }
+
+}

Added: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DateType.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DateType.java?rev=1137698&view=auto
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DateType.java (added)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DateType.java Mon Jun 20 16:52:10 2011
@@ -0,0 +1,178 @@
+package org.apache.cassandra.db.marshal;
+/*
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ * 
+ */
+import static org.apache.cassandra.db.marshal.TimeUUIDType.iso8601Patterns;
+
+import java.nio.ByteBuffer;
+import java.sql.Types;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.commons.lang.time.DateUtils;
+
+public class DateType extends AbstractType<Date>
+{
+    public static final DateType instance = new DateType();
+
+    static final String DEFAULT_FORMAT = iso8601Patterns[3];
+    
+    static final SimpleDateFormat FORMATTER = new SimpleDateFormat(DEFAULT_FORMAT);
+
+    DateType() {} // singleton
+
+    public Date compose(ByteBuffer bytes)
+    {
+        return new Date(ByteBufferUtil.toLong(bytes));
+    }
+    
+    public ByteBuffer decompose(Date value)
+    {
+      return (value==null) ? ByteBufferUtil.EMPTY_BYTE_BUFFER
+                           : ByteBufferUtil.bytes(value.getTime());
+    }
+    
+
+    public int compare(ByteBuffer o1, ByteBuffer o2)
+    {
+        if (o1.remaining() == 0)
+        {
+            return o2.remaining() == 0 ? 0 : -1;
+        }
+        if (o2.remaining() == 0)
+        {
+            return 1;
+        }
+
+        return ByteBufferUtil.compareUnsigned(o1, o2);
+    }
+
+    public String getString(ByteBuffer bytes)
+    {
+        if (bytes.remaining() == 0)
+        {
+            return "";
+        }
+        if (bytes.remaining() != 8)
+        {
+            throw new MarshalException("A date is exactly 8 bytes (stored as a long): "+bytes.remaining());
+        }
+        
+        // uses ISO-8601 formatted string
+        return FORMATTER.format(new Date(bytes.getLong(bytes.position())));
+    }
+
+    public String toString(Date d)
+    {
+      // uses ISO-8601 formatted string
+      return FORMATTER.format(d);
+    }
+
+    public ByteBuffer fromString(String source) throws MarshalException
+    {
+      // Return an empty ByteBuffer for an empty string.
+      if (source.isEmpty())
+          return ByteBufferUtil.EMPTY_BYTE_BUFFER;
+      
+      long millis;
+      ByteBuffer idBytes = null;
+      
+      if (source.toLowerCase().equals("now"))
+      {
+          millis = System.currentTimeMillis();
+          idBytes = ByteBufferUtil.bytes(millis);
+      }
+      // Milliseconds since epoch?
+      else if (source.matches("^\\d+$"))
+      {
+          try
+          {
+              idBytes = ByteBufferUtil.bytes(Long.parseLong(source));
+          }
+          catch (NumberFormatException e)
+          {
+              throw new MarshalException(String.format("unable to make long (for date) from:  '%s'", source), e);
+          }
+      }
+      // Last chance, attempt to parse as date-time string
+      else
+      {
+          try
+          {
+              millis = DateUtils.parseDate(source, iso8601Patterns).getTime();
+              idBytes = ByteBufferUtil.bytes(millis);
+          }
+          catch (ParseException e1)
+          {
+              throw new MarshalException(String.format("unable to coerce '%s' to a  formatted date (long)", source), e1);
+          }
+      }
+          
+      return idBytes;
+    }
+
+    public void validate(ByteBuffer bytes) throws MarshalException
+    {
+        if (bytes.remaining() != 8 && bytes.remaining() != 0)
+            throw new MarshalException(String.format("Expected 8 or 0 byte long for date (%d)", bytes.remaining()));
+    }
+
+    public Class<Date> getType()
+    {
+        return Date.class;
+    }
+
+    public boolean isSigned()
+    {
+      return false;
+    }
+
+    public boolean isCaseSensitive()
+    {
+      return false;
+    }
+
+    public boolean isCurrency()
+    {
+      return false;
+    }
+
+    public int getPrecision(Date obj)
+    {
+      return -1;
+    }
+
+    public int getScale(Date obj)
+    {
+      return -1;
+    }
+
+    public int getJdbcType()
+    {
+      return Types.DATE;
+    }
+
+    public boolean needsQuotes()
+    {
+      return false;
+    }
+}

Added: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DoubleType.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DoubleType.java?rev=1137698&view=auto
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DoubleType.java (added)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/DoubleType.java Mon Jun 20 16:52:10 2011
@@ -0,0 +1,143 @@
+package org.apache.cassandra.db.marshal;
+/*
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ * 
+ */
+
+import java.nio.ByteBuffer;
+import java.sql.Types;
+
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+public class DoubleType extends AbstractType<Double>
+{
+    public static final DoubleType instance = new DoubleType();
+
+    DoubleType() {} // singleton    
+
+    public Double compose(ByteBuffer bytes)
+    {
+      return ByteBufferUtil.toDouble(bytes);
+    }
+    
+    public ByteBuffer decompose(Double value)
+    {
+        return (value==null) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : ByteBufferUtil.bytes(value);
+    }
+    
+
+    public int compare(ByteBuffer o1, ByteBuffer o2)
+    {
+        if (o1.remaining() == 0)
+        {
+            return o2.remaining() == 0 ? 0 : -1;
+        }
+        if (o2.remaining() == 0)
+        {
+            return 1;
+        }
+        
+        return compose(o1).compareTo(compose(o2));
+    }
+
+    public String getString(ByteBuffer bytes)
+    {
+        if (bytes.remaining() == 0)
+        {
+            return "";
+        }
+        if (bytes.remaining() != 8)
+        {
+            throw new MarshalException("A double is exactly 8 bytes : "+bytes.remaining());
+        }
+        
+        return compose(bytes).toString();
+    }
+
+    public String toString(Double d)
+    {
+        return d.toString();
+    }
+
+    public ByteBuffer fromString(String source) throws MarshalException
+    {
+      // Return an empty ByteBuffer for an empty string.
+      if (source.isEmpty())
+          return ByteBufferUtil.EMPTY_BYTE_BUFFER;
+      
+      Double d;
+      try
+      {
+          d = Double.parseDouble(source);
+      }
+      catch (NumberFormatException e1)
+      {
+          throw new MarshalException(String.format("unable to coerce '%s' to a double", source), e1);
+      }
+          
+      return decompose(d);
+    }
+
+    public void validate(ByteBuffer bytes) throws MarshalException
+    {
+        if (bytes.remaining() != 8 && bytes.remaining() != 0)
+            throw new MarshalException(String.format("Expected 8 or 0 byte value for a double (%d)", bytes.remaining()));
+    }
+
+    public Class<Double> getType()
+    {
+        return Double.class;
+    }
+    
+    public boolean isSigned()
+    {
+      return true;
+    }
+
+    public boolean isCaseSensitive()
+    {
+      return false;
+    }
+
+    public boolean isCurrency()
+    {
+      return false;
+    }
+
+    public int getPrecision(Double obj) // see: http://teaching.idallen.org/dat2343/09f/notes/10FloatingPoint.htm
+    {
+      return 15;
+    }
+
+    public int getScale(Double obj) // see: http://teaching.idallen.org/dat2343/09f/notes/10FloatingPoint.htm
+    {
+      return 300;
+    }
+
+    public int getJdbcType()
+    {
+      return Types.DOUBLE;
+    }
+
+    public boolean needsQuotes()
+    {
+      return false;
+    }
+    
+}

Added: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/FloatType.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/FloatType.java?rev=1137698&view=auto
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/FloatType.java (added)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/marshal/FloatType.java Mon Jun 20 16:52:10 2011
@@ -0,0 +1,144 @@
+package org.apache.cassandra.db.marshal;
+/*
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ * 
+ */
+
+import java.nio.ByteBuffer;
+import java.sql.Types;
+
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+
+public class FloatType extends AbstractType<Float>
+{
+    public static final FloatType instance = new FloatType();
+
+    FloatType() {} // singleton    
+
+    public Float compose(ByteBuffer bytes)
+    {
+        return ByteBufferUtil.toFloat(bytes);
+    }
+    
+    public ByteBuffer decompose(Float value)
+    {
+        return (value==null) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : ByteBufferUtil.bytes(value);
+    }
+    
+
+    public int compare(ByteBuffer o1, ByteBuffer o2)
+    {
+        if (o1.remaining() == 0)
+        {
+            return o2.remaining() == 0 ? 0 : -1;
+        }
+        if (o2.remaining() == 0)
+        {
+            return 1;
+        }
+        
+        return compose(o1).compareTo(compose(o2));
+    }
+
+    public String getString(ByteBuffer bytes)
+    {
+        if (bytes.remaining() == 0)
+        {
+            return "";
+        }
+        if (bytes.remaining() != 4)
+        {
+            throw new MarshalException("A float is exactly 4 bytes : "+bytes.remaining());
+        }
+        
+        return compose(bytes).toString();
+    }
+
+    public String toString(Float d)
+    {
+      return d.toString();
+    }
+
+    public ByteBuffer fromString(String source) throws MarshalException
+    {
+      // Return an empty ByteBuffer for an empty string.
+      if (source.isEmpty())
+          return ByteBufferUtil.EMPTY_BYTE_BUFFER;
+      
+      Float f;
+      try
+      {
+          f = Float.parseFloat(source);
+      }
+      catch (NumberFormatException e1)
+      {
+          throw new MarshalException(String.format("unable to coerce '%s' to a float", source), e1);
+      }
+          
+      return ByteBufferUtil.bytes(f);
+    }
+
+    public void validate(ByteBuffer bytes) throws MarshalException
+    {
+        if (bytes.remaining() != 4 && bytes.remaining() != 0)
+            throw new MarshalException(String.format("Expected 4 or 0 byte value for a float (%d)", bytes.remaining()));
+    }
+
+    public Class<Float> getType()
+    {
+        return Float.class;
+    }
+
+    public boolean isSigned()
+    {
+      return true;
+    }
+
+    public boolean isCaseSensitive()
+    {
+      return false;
+    }
+
+    public boolean isCurrency()
+    {
+      return false;
+    }
+
+    public int getPrecision(Float obj) // see: http://teaching.idallen.org/dat2343/09f/notes/10FloatingPoint.htm
+    {
+      return 7;
+    }
+
+    public int getScale(Float obj) // see: http://teaching.idallen.org/dat2343/09f/notes/10FloatingPoint.htm
+    {
+      return 40;
+    }
+
+    public int getJdbcType()
+    {
+      return Types.FLOAT;
+    }
+
+    public boolean needsQuotes()
+    {
+      return false;
+    }
+    
+}