You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2015/09/15 18:41:46 UTC
[2/3] cassandra git commit: Improve efficieny of ColumnDefinition
comparison
Improve efficieny of ColumnDefinition comparison
patch by benedict; reviewed by sylvain for CASSANDRA-10316
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d68325bf
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d68325bf
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d68325bf
Branch: refs/heads/trunk
Commit: d68325bfd3eec7c84515c81b417524c6e60b98d2
Parents: 7ca4db0
Author: Benedict Elliott Smith <be...@apache.org>
Authored: Mon Sep 14 16:00:55 2015 +0100
Committer: Benedict Elliott Smith <be...@apache.org>
Committed: Tue Sep 15 17:40:38 2015 +0100
----------------------------------------------------------------------
.../apache/cassandra/config/ColumnDefinition.java | 17 +++++++++++------
.../apache/cassandra/cql3/ColumnIdentifier.java | 2 +-
2 files changed, 12 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d68325bf/src/java/org/apache/cassandra/config/ColumnDefinition.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/ColumnDefinition.java b/src/java/org/apache/cassandra/config/ColumnDefinition.java
index 17276bc..7dc425f 100644
--- a/src/java/org/apache/cassandra/config/ColumnDefinition.java
+++ b/src/java/org/apache/cassandra/config/ColumnDefinition.java
@@ -48,6 +48,7 @@ public class ColumnDefinition extends ColumnSpecification implements Comparable<
*/
public enum Kind
{
+ // NOTE: if adding a new type, must modify comparisonOrder
PARTITION_KEY,
CLUSTERING,
REGULAR,
@@ -75,13 +76,17 @@ public class ColumnDefinition extends ColumnSpecification implements Comparable<
/**
* These objects are compared frequently, so we encode several of their comparison components
- * into a single int value so that this can be done efficiently
+ * into a single long value so that this can be done efficiently
*/
- private final int comparisonOrder;
+ private final long comparisonOrder;
- private static int comparisonOrder(Kind kind, boolean isComplex, int position)
+ private static long comparisonOrder(Kind kind, boolean isComplex, long position, ColumnIdentifier name)
{
- return (kind.ordinal() << 28) | (isComplex ? 1 << 27 : 0) | position;
+ assert position >= 0 && position < 1 << 12;
+ return (((long) kind.ordinal()) << 61)
+ | (isComplex ? 1L << 60 : 0)
+ | (position << 48)
+ | (name.prefixComparison >>> 16);
}
public static ColumnDefinition partitionKeyDef(CFMetaData cfm, ByteBuffer name, AbstractType<?> type, int position)
@@ -147,7 +152,7 @@ public class ColumnDefinition extends ColumnSpecification implements Comparable<
this.cellPathComparator = makeCellPathComparator(kind, type);
this.cellComparator = cellPathComparator == null ? ColumnData.comparator : (a, b) -> cellPathComparator.compare(a.path(), b.path());
this.asymmetricCellPathComparator = cellPathComparator == null ? null : (a, b) -> cellPathComparator.compare(((Cell)a).path(), (CellPath) b);
- this.comparisonOrder = comparisonOrder(kind, isComplex(), position());
+ this.comparisonOrder = comparisonOrder(kind, isComplex(), position(), name);
}
private static Comparator<CellPath> makeCellPathComparator(Kind kind, AbstractType<?> type)
@@ -308,7 +313,7 @@ public class ColumnDefinition extends ColumnSpecification implements Comparable<
return 0;
if (comparisonOrder != other.comparisonOrder)
- return comparisonOrder - other.comparisonOrder;
+ return Long.compare(comparisonOrder, other.comparisonOrder);
return this.name.compareTo(other.name);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/d68325bf/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
index 6102bb9..4880c60 100644
--- a/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
+++ b/src/java/org/apache/cassandra/cql3/ColumnIdentifier.java
@@ -52,7 +52,7 @@ public class ColumnIdentifier extends org.apache.cassandra.cql3.selection.Select
* since these objects are compared frequently, we stash an efficiently compared prefix of the bytes, in the expectation
* that the majority of comparisons can be answered by this value only
*/
- private final long prefixComparison;
+ public final long prefixComparison;
private final boolean interned;
private static final long EMPTY_SIZE = ObjectSizes.measure(new ColumnIdentifier(ByteBufferUtil.EMPTY_BYTE_BUFFER, "", false));