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