Return-Path: X-Original-To: apmail-cassandra-commits-archive@www.apache.org Delivered-To: apmail-cassandra-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0B08D6C89 for ; Mon, 20 Jun 2011 16:52:37 +0000 (UTC) Received: (qmail 16799 invoked by uid 500); 20 Jun 2011 16:52:36 -0000 Delivered-To: apmail-cassandra-commits-archive@cassandra.apache.org Received: (qmail 16773 invoked by uid 500); 20 Jun 2011 16:52:36 -0000 Mailing-List: contact commits-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cassandra.apache.org Delivered-To: mailing list commits@cassandra.apache.org Received: (qmail 16765 invoked by uid 99); 20 Jun 2011 16:52:36 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 20 Jun 2011 16:52:36 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 20 Jun 2011 16:52:32 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id B1B3C23889B2; Mon, 20 Jun 2011 16:52:10 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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 Date: Mon, 20 Jun 2011 16:52:10 -0000 To: commits@cassandra.apache.org From: jbellis@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110620165210.B1B3C23889B2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 +{ + 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 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 +{ + 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 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 +{ + 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 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 +{ + 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 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; + } + +}