git commit: Fix CompositeType.{get/from}String methods
Updated Branches: refs/heads/cassandra-1.1 95fb613bf - 5d5207b91 Fix CompositeType.{get/from}String methods patch by slebresne; reviewed by jbellis for CASSANDRA-4842 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/5d5207b9 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/5d5207b9 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/5d5207b9 Branch: refs/heads/cassandra-1.1 Commit: 5d5207b9111ddbc576d67153175e5a6e27994b73 Parents: 95fb613 Author: Sylvain Lebresne sylv...@datastax.com Authored: Wed Oct 24 20:35:32 2012 +0200 Committer: Sylvain Lebresne sylv...@datastax.com Committed: Wed Oct 24 20:35:32 2012 +0200 -- CHANGES.txt|1 + .../db/marshal/AbstractCompositeType.java | 115 ++- .../cassandra/db/marshal/CompositeTypeTest.java| 35 +- 3 files changed, 115 insertions(+), 36 deletions(-) -- http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d5207b9/CHANGES.txt -- diff --git a/CHANGES.txt b/CHANGES.txt index f309ef1..95feb9b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,7 @@ * fix wrong leveled compaction progress calculation (CASSANDRA-4807) * add a close() method to CRAR to prevent leaking file descriptors (CASSANDRA-4820) * fix potential infinite loop in get_count (CASSANDRA-4833) + * fix compositeType.{get/from}String methods (CASSANDRA-4842) 1.1.6 * Wait for writes on synchronous read digest mismatch (CASSANDRA-4792) http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d5207b9/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java -- diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java b/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java index dac94e2..5c58c8e 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java @@ -20,6 +20,7 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -125,33 +126,6 @@ public abstract class AbstractCompositeType extends AbstractTypeByteBuffer return l.toArray(new ByteBuffer[l.size()]); } -public String getString(ByteBuffer bytes) -{ -StringBuilder sb = new StringBuilder(); -ByteBuffer bb = bytes.duplicate(); -int i = 0; - -while (bb.remaining() 0) -{ -if (bb.remaining() != bytes.remaining()) -sb.append(:); - -AbstractType? comparator = getAndAppendNextComparator(i, bb, sb); -ByteBuffer value = getWithShortLength(bb); - -sb.append(comparator.getString(value)); - -byte b = bb.get(); -if (b != 0) -{ -sb.append(:!); -break; -} -++i; -} -return sb.toString(); -} - public static class CompositeComponent { public AbstractType comparator; @@ -185,16 +159,87 @@ public abstract class AbstractCompositeType extends AbstractTypeByteBuffer } /* - * FIXME: this would break if some of the component string representation - * contains ':'. None of our current comparator do so, so this is probably - * not an urgent matter, but this could break for custom comparator. - * (DynamicCompositeType would break on '@' too) + * Escapes all occurences of the ':' character from the input, replacing them by \:. + * Furthermore, if the last character is '\' or '!', a '!' is appended. + */ +static String escape(String input) +{ +if (input.isEmpty()) +return input; + +String res = input.replaceAll(:, :); +char last = res.charAt(res.length() - 1); +return last == '\\' || last == '!' ? res + '!' : res; +} + +/* + * Reverses the effect of espace(). + * Replaces all occurences of \: by : and remove last character if it is '!'. */ +static String unescape(String input) +{ +if (input.isEmpty()) +return input; + +String res = input.replaceAll(:, :); +char last = res.charAt(res.length() - 1); +return last == '!' ? res.substring(0, res.length() - 1) : res; +} + +/* + * Split the input on character ':', unless the previous character is '\'. + */ +static ListString split(String input) +{ +if (input.isEmpty()) +return Collections.StringemptyList(); + +ListString res = new
[2/2] git commit: Fix CompositeType.{get/from}String methods
Fix CompositeType.{get/from}String methods patch by slebresne; reviewed by jbellis for CASSANDRA-4842 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/5d5207b9 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/5d5207b9 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/5d5207b9 Branch: refs/heads/trunk Commit: 5d5207b9111ddbc576d67153175e5a6e27994b73 Parents: 95fb613 Author: Sylvain Lebresne sylv...@datastax.com Authored: Wed Oct 24 20:35:32 2012 +0200 Committer: Sylvain Lebresne sylv...@datastax.com Committed: Wed Oct 24 20:35:32 2012 +0200 -- CHANGES.txt|1 + .../db/marshal/AbstractCompositeType.java | 115 ++- .../cassandra/db/marshal/CompositeTypeTest.java| 35 +- 3 files changed, 115 insertions(+), 36 deletions(-) -- http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d5207b9/CHANGES.txt -- diff --git a/CHANGES.txt b/CHANGES.txt index f309ef1..95feb9b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,7 @@ * fix wrong leveled compaction progress calculation (CASSANDRA-4807) * add a close() method to CRAR to prevent leaking file descriptors (CASSANDRA-4820) * fix potential infinite loop in get_count (CASSANDRA-4833) + * fix compositeType.{get/from}String methods (CASSANDRA-4842) 1.1.6 * Wait for writes on synchronous read digest mismatch (CASSANDRA-4792) http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d5207b9/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java -- diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java b/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java index dac94e2..5c58c8e 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java @@ -20,6 +20,7 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -125,33 +126,6 @@ public abstract class AbstractCompositeType extends AbstractTypeByteBuffer return l.toArray(new ByteBuffer[l.size()]); } -public String getString(ByteBuffer bytes) -{ -StringBuilder sb = new StringBuilder(); -ByteBuffer bb = bytes.duplicate(); -int i = 0; - -while (bb.remaining() 0) -{ -if (bb.remaining() != bytes.remaining()) -sb.append(:); - -AbstractType? comparator = getAndAppendNextComparator(i, bb, sb); -ByteBuffer value = getWithShortLength(bb); - -sb.append(comparator.getString(value)); - -byte b = bb.get(); -if (b != 0) -{ -sb.append(:!); -break; -} -++i; -} -return sb.toString(); -} - public static class CompositeComponent { public AbstractType comparator; @@ -185,16 +159,87 @@ public abstract class AbstractCompositeType extends AbstractTypeByteBuffer } /* - * FIXME: this would break if some of the component string representation - * contains ':'. None of our current comparator do so, so this is probably - * not an urgent matter, but this could break for custom comparator. - * (DynamicCompositeType would break on '@' too) + * Escapes all occurences of the ':' character from the input, replacing them by \:. + * Furthermore, if the last character is '\' or '!', a '!' is appended. + */ +static String escape(String input) +{ +if (input.isEmpty()) +return input; + +String res = input.replaceAll(:, :); +char last = res.charAt(res.length() - 1); +return last == '\\' || last == '!' ? res + '!' : res; +} + +/* + * Reverses the effect of espace(). + * Replaces all occurences of \: by : and remove last character if it is '!'. */ +static String unescape(String input) +{ +if (input.isEmpty()) +return input; + +String res = input.replaceAll(:, :); +char last = res.charAt(res.length() - 1); +return last == '!' ? res.substring(0, res.length() - 1) : res; +} + +/* + * Split the input on character ':', unless the previous character is '\'. + */ +static ListString split(String input) +{ +if (input.isEmpty()) +return Collections.StringemptyList(); + +ListString res = new ArrayListString(); +int prev = 0; +for (int i = 0; i input.length(); i++) +