Skip to content

Commit

Permalink
add uncommitted files
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/cassandra/branches/cassandra-0.8@1137698 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
jbellis committed Jun 20, 2011
1 parent 480a399 commit 6b0760c
Show file tree
Hide file tree
Showing 5 changed files with 611 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/java/org/apache/cassandra/db/Table.java
Expand Up @@ -489,7 +489,16 @@ private static void ignoreObsoleteMutations(ColumnFamily cf, SortedSet<ByteBuffe
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.,
Expand Down
136 changes: 136 additions & 0 deletions src/java/org/apache/cassandra/db/marshal/BooleanType.java
@@ -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;
}

}
178 changes: 178 additions & 0 deletions src/java/org/apache/cassandra/db/marshal/DateType.java
@@ -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;
}
}

0 comments on commit 6b0760c

Please sign in to comment.