You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by el...@apache.org on 2013/05/05 04:45:18 UTC
svn commit: r1479229 - in /accumulo/trunk:
core/src/main/java/org/apache/accumulo/core/client/lexicoder/
core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/
core/src/main/java/org/apache/accumulo/core/util/
core/src/test/java/org/apache/...
Author: elserj
Date: Sun May 5 02:45:17 2013
New Revision: 1479229
URL: http://svn.apache.org/r1479229
Log:
ACCUMULO-1336 Apply patch from Corey Nolet to add Typo "lexicoders" to Accumulo
Added:
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BytesLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DateLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Encoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Lexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ListLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/LongLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/PairLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/StringLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/TextLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoder.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/ByteUtils.java
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/FixedByteArrayOutputStream.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ListLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LongLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/PairLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoderTest.java
accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoderTest.java
Modified:
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/util/Pair.java
accumulo/trunk/docs/src/main/latex/accumulo_user_manual/chapters/table_design.tex
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,83 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+
+import org.apache.accumulo.core.iterators.ValueFormatException;
+import org.apache.accumulo.core.client.lexicoder.util.FixedByteArrayOutputStream;
+
+/**
+ *
+ */
+public class BigIntegerLexicoder implements Lexicoder<BigInteger> {
+
+ @Override
+ public byte[] encode(BigInteger v) {
+
+ try {
+ byte[] bytes = v.toByteArray();
+
+ byte[] ret = new byte[4 + bytes.length];
+
+ DataOutputStream dos = new DataOutputStream(new FixedByteArrayOutputStream(ret));
+
+ // flip the sign bit
+ bytes[0] = (byte) (0x80 ^ bytes[0]);
+
+ int len = bytes.length;
+ if (v.signum() < 0)
+ len = -len;
+
+ len = len ^ 0x80000000;
+
+ dos.writeInt(len);
+ dos.write(bytes);
+
+ return ret;
+ } catch (IOException ioe) {
+ throw new RuntimeException(ioe);
+ }
+
+
+ }
+
+ @Override
+ public BigInteger decode(byte[] b) throws ValueFormatException {
+
+ try {
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(b));
+ int len = dis.readInt();
+ len = len ^ 0x80000000;
+ len = Math.abs(len);
+
+ byte[] bytes = new byte[len];
+ dis.readFully(bytes);
+
+ bytes[0] = (byte) (0x80 ^ bytes[0]);
+
+ return new BigInteger(bytes);
+ } catch (IOException ioe) {
+ throw new RuntimeException(ioe);
+ }
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BytesLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BytesLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BytesLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/BytesLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ *
+ */
+public class BytesLexicoder implements Lexicoder<byte[]> {
+
+ @Override
+ public byte[] encode(byte[] data) {
+ return data;
+ }
+
+ @Override
+ public byte[] decode(byte[] data) {
+ return data;
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DateLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DateLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DateLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DateLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.util.Date;
+
+/**
+ *
+ */
+public class DateLexicoder implements Lexicoder<Date> {
+
+ private ULongLexicoder longEncoder = new ULongLexicoder();
+
+ @Override
+ public byte[] encode(Date data) {
+ return longEncoder.encode(data.getTime());
+ }
+
+ @Override
+ public Date decode(byte[] data) {
+ return new Date(longEncoder.decode(data));
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,47 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ *
+ */
+public class DoubleLexicoder implements Lexicoder<Double> {
+
+ private ULongLexicoder longEncoder = new ULongLexicoder();
+
+ @Override
+ public byte[] encode(Double d) {
+ long l = Double.doubleToRawLongBits(d);
+ if (l < 0)
+ l = ~l;
+ else
+ l = l ^ 0x8000000000000000l;
+
+ return longEncoder.encode(l);
+ }
+
+ @Override
+ public Double decode(byte[] data) {
+ long l = longEncoder.decode(data);
+ if (l < 0)
+ l = l ^ 0x8000000000000000l;
+ else
+ l = ~l;
+ return Double.longBitsToDouble(l);
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Encoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Encoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Encoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Encoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ *
+ */
+public interface Encoder<T> extends org.apache.accumulo.core.iterators.TypedValueCombiner.Encoder<T> {
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,36 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ *
+ */
+public class IntegerLexicoder implements Lexicoder<Integer> {
+
+ private UIntegerLexicoder uil = new UIntegerLexicoder();
+
+ @Override
+ public byte[] encode(Integer i) {
+ return uil.encode(i ^ 0x80000000);
+ }
+
+ @Override
+ public Integer decode(byte[] data) {
+ return uil.decode(data) ^ 0x80000000;
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Lexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Lexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Lexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/Lexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ * An encoder that produces byte arrays in which the lexicographic sort order corresponds to the types sort order.
+ */
+public interface Lexicoder<T> extends Encoder<T> {
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ListLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ListLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ListLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ListLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,60 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.concat;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.escape;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.split;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.unescape;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ListLexicoder<LT> implements Lexicoder<List<LT>> {
+
+ private Lexicoder<LT> lexicoder;
+
+ public ListLexicoder(Lexicoder<LT> lexicoder) {
+ this.lexicoder = lexicoder;
+ }
+
+ @Override
+ public byte[] encode(List<LT> v) {
+ byte[][] encElements = new byte[v.size()][];
+
+ int index = 0;
+ for (LT element : v) {
+ encElements[index++] = escape(lexicoder.encode(element));
+ }
+
+ return concat(encElements);
+ }
+
+ @Override
+ public List<LT> decode(byte[] b) {
+
+ byte[][] escapedElements = split(b);
+ ArrayList<LT> ret = new ArrayList<LT>(escapedElements.length);
+
+ for (byte[] escapedElement : escapedElements) {
+ ret.add(lexicoder.decode(unescape(escapedElement)));
+ }
+
+ return ret;
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/LongLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/LongLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/LongLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/LongLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ * Signed long encoder. The lexicographic encoding sorts Long.MIN_VALUE first and Long.MAX_VALUE last. The lexicographic encoding sorts -2l before -1l. It
+ * corresponds to the sort order of Long.
+ */
+public class LongLexicoder extends ULongLexicoder {
+ @Override
+ public byte[] encode(Long l) {
+ return super.encode(l ^ 0x8000000000000000l);
+ }
+
+ @Override
+ public Long decode(byte[] data) {
+ return super.decode(data) ^ 0x8000000000000000l;
+ }
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/PairLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/PairLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/PairLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/PairLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.concat;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.escape;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.split;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.unescape;
+
+import org.apache.accumulo.core.util.Pair;
+
+public class PairLexicoder<A,B> implements Lexicoder<Pair<A,B>> {
+
+ private Lexicoder<A> firstLexicoder;
+ private Lexicoder<B> secondLexicoder;
+
+ public PairLexicoder(Lexicoder<A> firstLexicoder, Lexicoder<B> secondLexicoder) {
+ this.firstLexicoder = firstLexicoder;
+ this.secondLexicoder = secondLexicoder;
+ }
+
+ @Override
+ public byte[] encode(Pair<A,B> data) {
+ return concat(escape(firstLexicoder.encode(data.getFirst())), escape(secondLexicoder.encode(data.getSecond())));
+ }
+
+ @Override
+ public Pair<A,B> decode(byte[] data) {
+
+ byte[][] fields = split(data);
+ if (fields.length != 2) {
+ throw new RuntimeException("Data does not have 2 fields, it has " + fields.length);
+ }
+
+ return new Pair<A,B>(firstLexicoder.decode(unescape(fields[0])), secondLexicoder.decode(unescape(fields[1])));
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.escape;
+import static org.apache.accumulo.core.client.lexicoder.util.ByteUtils.unescape;
+
+public class ReverseLexicoder<T> implements Lexicoder<T> {
+
+ private Lexicoder<T> lexicoder;
+
+ public ReverseLexicoder(Lexicoder<T> lexicoder) {
+ this.lexicoder = lexicoder;
+ }
+
+ @Override
+ public byte[] encode(T data) {
+ byte[] bytes = escape(lexicoder.encode(data));
+ byte[] ret = new byte[bytes.length + 1];
+
+ for (int i = 0; i < bytes.length; i++)
+ ret[i] = (byte) (0xff - (0xff & bytes[i]));
+
+ ret[bytes.length] = (byte) 0xff;
+
+ return ret;
+ }
+
+ @Override
+ public T decode(byte[] data) {
+ byte ret[] = new byte[data.length - 1];
+
+ for (int i = 0; i < ret.length; i++)
+ ret[i] = (byte) (0xff - (0xff & data[i]));
+
+ return lexicoder.decode(unescape(ret));
+ }
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/StringLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/StringLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/StringLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/StringLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,41 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.io.UnsupportedEncodingException;
+
+public class StringLexicoder implements Lexicoder<String> {
+
+ @Override
+ public byte[] encode(String data) {
+ try {
+ return data.getBytes("UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public String decode(byte[] data) {
+ try {
+ return new String(data, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/TextLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/TextLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/TextLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/TextLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import org.apache.accumulo.core.util.TextUtil;
+import org.apache.hadoop.io.Text;
+
+public class TextLexicoder implements Lexicoder<Text> {
+
+ @Override
+ public byte[] encode(Text data) {
+ return TextUtil.getBytes(data);
+ }
+
+ @Override
+ public Text decode(byte[] data) {
+ return new Text(data);
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,72 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ *
+ */
+public class UIntegerLexicoder implements Lexicoder<Integer> {
+
+ @Override
+ public byte[] encode(Integer i) {
+ int shift = 56;
+ int index;
+ int prefix = i < 0 ? 0xff : 0x00;
+
+ for (index = 0; index < 4; index++) {
+ if (((i >>> shift) & 0xff) != prefix)
+ break;
+
+ shift -= 8;
+ }
+
+ byte ret[] = new byte[5 - index];
+ ret[0] = (byte) (4 - index);
+ for (index = 1; index < ret.length; index++) {
+ ret[index] = (byte) (i >>> shift);
+ shift -= 8;
+ }
+
+ if (i < 0)
+ ret[0] = (byte) (8 - ret[0]);
+
+ return ret;
+
+ }
+
+ @Override
+ public Integer decode(byte[] data) {
+
+ if (data[0] < 0 || data[0] > 8)
+ throw new IllegalArgumentException("Unexpected length " + (0xff & data[0]));
+
+ int i = 0;
+ int shift = 0;
+
+ for (int idx = data.length - 1; idx >= 1; idx--) {
+ i += (data[idx] & 0xffl) << shift;
+ shift += 8;
+ }
+
+ // fill in 0xff prefix
+ if (data[0] > 4)
+ i |= -1 << ((8 - data[0]) << 3);
+
+ return i;
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,72 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ * Unsigned long encoder. The lexicographic encoding sorts first 0l and -1l last. This encoding does not correspond to the sort of Long because it does not
+ * consider the sign bit. If Java had an unsigned long type, this encoder would correspond to its sort order.
+ */
+public class ULongLexicoder implements Lexicoder<Long> {
+
+ @Override
+ public byte[] encode(Long l) {
+ int shift = 56;
+ int index;
+ int prefix = l < 0 ? 0xff : 0x00;
+
+ for (index = 0; index < 8; index++) {
+ if (((l >>> shift) & 0xff) != prefix)
+ break;
+
+ shift -= 8;
+ }
+
+ byte ret[] = new byte[9 - index];
+ ret[0] = (byte) (8 - index);
+ for (index = 1; index < ret.length; index++) {
+ ret[index] = (byte) (l >>> shift);
+ shift -= 8;
+ }
+
+ if (l < 0)
+ ret[0] = (byte) (16 - ret[0]);
+
+ return ret;
+
+ }
+
+ @Override
+ public Long decode(byte[] data) {
+
+ long l = 0;
+ int shift = 0;
+
+ if (data[0] < 0 || data[0] > 16)
+ throw new IllegalArgumentException("Unexpected length " + (0xff & data[0]));
+
+ for (int i = data.length - 1; i >= 1; i--) {
+ l += (data[i] & 0xffl) << shift;
+ shift += 8;
+ }
+
+ // fill in 0xff prefix
+ if (data[0] > 8)
+ l |= -1l << ((16 - data[0]) << 3);
+
+ return l;
+ }
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoder.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoder.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoder.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoder.java Sun May 5 02:45:17 2013
@@ -0,0 +1,57 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.UUID;
+
+import org.apache.accumulo.core.iterators.ValueFormatException;
+import org.apache.accumulo.core.client.lexicoder.util.FixedByteArrayOutputStream;
+
+public class UUIDLexicoder implements Lexicoder<UUID> {
+
+ @Override
+ public byte[] encode(UUID uuid) {
+ try {
+ byte ret[] = new byte[16];
+ DataOutputStream out = new DataOutputStream(new FixedByteArrayOutputStream(ret));
+
+ out.writeLong(uuid.getMostSignificantBits() ^ 0x8000000000000000l);
+ out.writeLong(uuid.getLeastSignificantBits() ^ 0x8000000000000000l);
+
+ out.close();
+
+ return ret;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public UUID decode(byte[] b) throws ValueFormatException {
+ try {
+ DataInputStream in = new DataInputStream(new ByteArrayInputStream(b));
+ return new UUID(in.readLong() ^ 0x8000000000000000l, in.readLong() ^ 0x8000000000000000l);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/ByteUtils.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/ByteUtils.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/ByteUtils.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/ByteUtils.java Sun May 5 02:45:17 2013
@@ -0,0 +1,116 @@
+package org.apache.accumulo.core.client.lexicoder.util;
+
+import java.util.ArrayList;
+
+public class ByteUtils {
+
+ /**
+ * Escapes 0x00 with 0x01 0x01 and 0x01 with 0x01 0x02
+ *
+ * @param in
+ * @return
+ */
+ public static byte[] escape(byte[] in) {
+ int escapeCount = 0;
+ for (int i = 0; i < in.length; i++) {
+ if (in[i] == 0x00 || in[i] == 0x01) {
+ escapeCount++;
+ }
+ }
+
+ if (escapeCount == 0)
+ return in;
+
+ byte ret[] = new byte[escapeCount + in.length];
+ int index = 0;
+
+ for (int i = 0; i < in.length; i++) {
+ switch (in[i]) {
+ case 0x00:
+ ret[index++] = 0x01;
+ ret[index++] = 0x01;
+ break;
+ case 0x01:
+ ret[index++] = 0x01;
+ ret[index++] = 0x02;
+ break;
+ default:
+ ret[index++] = in[i];
+ }
+ }
+
+ return ret;
+ }
+
+ public static byte[] unescape(byte[] in) {
+ int escapeCount = 0;
+ for (int i = 0; i < in.length; i++) {
+ if (in[i] == 0x01) {
+ escapeCount++;
+ i++;
+ }
+ }
+
+ if (escapeCount == 0)
+ return in;
+
+ byte ret[] = new byte[in.length - escapeCount];
+
+ int index = 0;
+ for (int i = 0; i < in.length; i++) {
+ if (in[i] == 0x01) {
+ i++;
+ ret[index++] = (byte) (in[i] - 1);
+ } else {
+ ret[index++] = in[i];
+ }
+
+ }
+
+ return ret;
+ }
+
+ public static byte[][] split(byte[] data) {
+ ArrayList<Integer> offsets = new ArrayList<Integer>();
+
+ for (int i = 0; i < data.length; i++) {
+ if (data[i] == 0x00) {
+ offsets.add(i);
+ }
+ }
+
+ offsets.add(data.length);
+
+ byte[][] ret = new byte[offsets.size()][];
+
+ int index = 0;
+ for (int i = 0; i < offsets.size(); i++) {
+ ret[i] = new byte[offsets.get(i) - index];
+ System.arraycopy(data, index, ret[i], 0, ret[i].length);
+ index = offsets.get(i) + 1;
+ }
+
+ return ret;
+ }
+
+ public static byte[] concat(byte[]... fields) {
+ int len = 0;
+ for (byte[] field : fields) {
+ len += field.length;
+ }
+
+ byte ret[] = new byte[len + fields.length - 1];
+ int index = 0;
+
+ for (byte[] field : fields) {
+ System.arraycopy(field, 0, ret, index, field.length);
+ index += field.length;
+ if (index < ret.length)
+ ret[index++] = 0x00;
+ }
+
+ return ret;
+ }
+
+
+}
Added: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/FixedByteArrayOutputStream.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/FixedByteArrayOutputStream.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/FixedByteArrayOutputStream.java (added)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/client/lexicoder/util/FixedByteArrayOutputStream.java Sun May 5 02:45:17 2013
@@ -0,0 +1,42 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder.util;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class FixedByteArrayOutputStream extends OutputStream {
+
+ private int i;
+ byte out[];
+
+ public FixedByteArrayOutputStream(byte out[]) {
+ this.out = out;
+ }
+
+ @Override
+ public void write(int b) throws IOException {
+ out[i++] = (byte) b;
+ }
+
+ @Override
+ public void write(byte b[], int off, int len) throws IOException {
+ System.arraycopy(b, off, out, i, len);
+ i += len;
+ }
+
+}
Modified: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/util/Pair.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/util/Pair.java?rev=1479229&r1=1479228&r2=1479229&view=diff
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/util/Pair.java (original)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/util/Pair.java Sun May 5 02:45:17 2013
@@ -16,7 +16,7 @@
*/
package org.apache.accumulo.core.util;
-public class Pair<A,B> {
+public class Pair<A,B> implements Comparable<Pair<A,B>> {
A first;
B second;
@@ -63,4 +63,15 @@ public class Pair<A,B> {
public String toString() {
return "(" + first + "," + second + ")";
}
+
+
+ @Override
+ public int compareTo(Pair<A, B> abPair) {
+ int cmp = ((Comparable<A>) first).compareTo(abPair.first);
+ if (cmp == 0) {
+ cmp = ((Comparable<B>) second).compareTo(abPair.second);
+ }
+
+ return cmp;
+ }
}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/BigIntegerLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,35 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.math.BigInteger;
+
+/**
+ *
+ */
+public class BigIntegerLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+ assertSortOrder(new BigIntegerLexicoder(), new BigInteger("-1"), new BigInteger("0"), new BigInteger("1"), new BigInteger("-257"), new BigInteger("-256"),
+ new BigInteger("-255"), new BigInteger("255"), new BigInteger("256"), new BigInteger("257"), new BigInteger("65534"), new BigInteger("65535"),
+ new BigInteger("65536"), new BigInteger("65537"), new BigInteger("-65534"), new BigInteger("-65535"), new BigInteger("-65536"),
+ new BigInteger("-65537"), new BigInteger("2147483648"), new BigInteger("2147483647"), new BigInteger("2147483649"), new BigInteger("-2147483648"),
+ new BigInteger("-2147483647"), new BigInteger("-2147483649"), new BigInteger("32768"), new BigInteger("32769"), new BigInteger("32767"),
+ new BigInteger("-32768"), new BigInteger("-32769"), new BigInteger("-32767"), new BigInteger("126"), new BigInteger("127"), new BigInteger("128"),
+ new BigInteger("129"), new BigInteger("-126"), new BigInteger("-127"), new BigInteger("-128"), new BigInteger("-129"));
+
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/DoubleLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+/**
+ *
+ */
+public class DoubleLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+ assertSortOrder(new DoubleLexicoder(), Double.MIN_VALUE, Double.MAX_VALUE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0.0, 0.01, 0.001, 1.0, -1.0,
+ -1.1, -1.01, Math.nextUp(Double.NEGATIVE_INFINITY), Math.nextAfter(0.0, Double.NEGATIVE_INFINITY),
+ Math.nextAfter(Double.MAX_VALUE, Double.NEGATIVE_INFINITY), Math.pow(10.0, 30.0) * -1.0, Math.pow(10.0, 30.0), Math.pow(10.0, -30.0) * -1.0,
+ Math.pow(10.0, -30.0));
+
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/IntegerLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+public class IntegerLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+ assertSortOrder(new IntegerLexicoder(), Integer.MIN_VALUE, 0xff123456, 0xffff3456, 0xffffff56, -1, 0, 1, 0x12, 0x1234, 0x123456, 0x1234678,
+ Integer.MAX_VALUE);
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,65 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.accumulo.core.client.lexicoder.Lexicoder;
+import org.apache.accumulo.core.util.TextUtil;
+import org.apache.hadoop.io.Text;
+
+public abstract class LexicoderTest extends TestCase {
+
+ void assertEqualsB(byte[] ba1, byte[] ba2) {
+ assertEquals(new Text(ba2), new Text(ba1));
+ }
+
+ public <T extends Comparable<T>> void assertSortOrder(Lexicoder<T> lexicoder, Comparator<T> comp, T... data) {
+ List<T> list = new ArrayList<T>();
+ List<Text> encList = new ArrayList<Text>();
+
+ for (T d : data) {
+ list.add(d);
+ encList.add(new Text(lexicoder.encode(d)));
+ }
+
+ if (comp != null)
+ Collections.sort(list, comp);
+ else
+ Collections.sort(list);
+
+ Collections.sort(encList);
+
+ List<T> decodedList = new ArrayList<T>();
+
+ for (Text t : encList) {
+ decodedList.add(lexicoder.decode(TextUtil.getBytes(t)));
+ }
+
+ assertEquals(list, decodedList);
+ }
+
+ public <T extends Comparable<T>> void assertSortOrder(Lexicoder<T> lexicoder, T... data) {
+ assertSortOrder(lexicoder, null, data);
+ }
+
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ListLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ListLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ListLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ListLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,74 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TreeSet;
+
+import org.apache.accumulo.core.util.TextUtil;
+import org.apache.hadoop.io.Text;
+
+public class ListLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+ List<Long> data1 = new ArrayList<Long>();
+ data1.add(1l);
+ data1.add(2l);
+
+ List<Long> data2 = new ArrayList<Long>();
+ data2.add(1l);
+
+ List<Long> data3 = new ArrayList<Long>();
+ data3.add(1l);
+ data3.add(3l);
+
+ List<Long> data4 = new ArrayList<Long>();
+ data4.add(1l);
+ data4.add(2l);
+ data4.add(3l);
+
+ List<Long> data5 = new ArrayList<Long>();
+ data5.add(2l);
+ data5.add(1l);
+
+ List<List<Long>> data = new ArrayList<List<Long>>();
+
+ // add list in expected sort order
+ data.add(data2);
+ data.add(data1);
+ data.add(data4);
+ data.add(data3);
+ data.add(data5);
+
+ TreeSet<Text> sortedEnc = new TreeSet<Text>();
+
+ ListLexicoder<Long> listLexicoder = new ListLexicoder<Long>(new LongLexicoder());
+
+ for (List<Long> list : data) {
+ sortedEnc.add(new Text(listLexicoder.encode(list)));
+ }
+
+ List<List<Long>> unenc = new ArrayList<List<Long>>();
+
+ for (Text enc : sortedEnc) {
+ unenc.add(listLexicoder.decode(TextUtil.getBytes(enc)));
+ }
+
+ assertEquals(data, unenc);
+
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LongLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LongLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LongLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/LongLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,26 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+public class LongLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+
+ assertSortOrder(new LongLexicoder(), Long.MIN_VALUE, 0xff1234567890abcdl, 0xffff1234567890abl, 0xffffff567890abcdl, 0xffffffff7890abcdl,
+ 0xffffffffff90abcdl, 0xffffffffffffabcdl, 0xffffffffffffffcdl, -1l, 0l, 0x01l, 0x1234l, 0x123456l, 0x12345678l, 0x1234567890l, 0x1234567890abl,
+ 0x1234567890abcdl, 0x1234567890abcdefl, Long.MAX_VALUE);
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/PairLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/PairLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/PairLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/PairLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,36 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import org.apache.accumulo.core.util.Pair;
+
+/**
+ *
+ */
+public class PairLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+ PairLexicoder<String,String> plexc = new PairLexicoder<String,String>(new StringLexicoder(), new StringLexicoder());
+
+ assertSortOrder(plexc, new Pair<String,String>("a", "b"), new Pair<String,String>("a", "bc"), new Pair<String,String>("a", "c"), new Pair<String,String>(
+ "ab", "c"), new Pair<String,String>("ab", ""), new Pair<String,String>("ab", "d"), new Pair<String,String>("b", "f"), new Pair<String,String>("b", "a"));
+
+ PairLexicoder<Long,String> plexc2 = new PairLexicoder<Long,String>(new LongLexicoder(), new StringLexicoder());
+
+ assertSortOrder(plexc2, new Pair<Long,String>(0x100l, "a"), new Pair<Long,String>(0x100l, "ab"), new Pair<Long,String>(0xf0l, "a"), new Pair<Long,String>(
+ 0xf0l, "ab"));
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ReverseLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,62 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+
+import org.junit.Test;
+
+public class ReverseLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+ Comparator<Long> comp = Collections.reverseOrder();
+ assertSortOrder(new ReverseLexicoder<Long>(new LongLexicoder()), comp, Long.MIN_VALUE, 0xff1234567890abcdl, 0xffff1234567890abl, 0xffffff567890abcdl,
+ 0xffffffff7890abcdl, 0xffffffffff90abcdl, 0xffffffffffffabcdl, 0xffffffffffffffcdl, -1l, 0l, 0x01l, 0x1234l, 0x123456l, 0x12345678l, 0x1234567890l,
+ 0x1234567890abl, 0x1234567890abcdl, 0x1234567890abcdefl, Long.MAX_VALUE);
+
+ Comparator<String> comp2 = Collections.reverseOrder();
+ assertSortOrder(new ReverseLexicoder<String>(new StringLexicoder()), comp2, "a", "aa", "ab", "b", "aab");
+
+ }
+
+ /**
+ * Just a simple test verifying reverse indexed dates
+ *
+ * @throws UnsupportedEncodingException
+ */
+ @Test
+ public void testReverseSortDates() throws UnsupportedEncodingException {
+
+ ReverseLexicoder revLex = new ReverseLexicoder(new DateLexicoder());
+
+ Date date1 = new Date();
+ Date date2 = new Date(System.currentTimeMillis() + 10000);
+ Date date3 = new Date(System.currentTimeMillis() + 500);
+
+ Comparator<Date> comparator = Collections.reverseOrder();
+ assertSortOrder(revLex, comparator, date1, date2, date3);
+
+ // truncate date to hours
+ long time = System.currentTimeMillis() - (System.currentTimeMillis() % 3600000);
+ Date date = new Date(time);
+
+ System.out.println(date);
+
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UIntegerLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+public class UIntegerLexicoderTest extends LexicoderTest {
+ public void testEncoding() {
+ UIntegerLexicoder uil = new UIntegerLexicoder();
+
+ assertEqualsB(uil.encode(0), new byte[] {0x00});
+ assertEqualsB(uil.encode(0x01), new byte[] {0x01, 0x01});
+ assertEqualsB(uil.encode(0x0102), new byte[] {0x02, 0x01, 0x02});
+ assertEqualsB(uil.encode(0x010203), new byte[] {0x03, 0x01, 0x02, 0x03});
+ assertEqualsB(uil.encode(0x01020304), new byte[] {0x04, 0x01, 0x02, 0x03, 0x04});
+ assertEqualsB(uil.encode(0xff020304), new byte[] {0x05, 0x02, 0x03, 0x04});
+ assertEqualsB(uil.encode(0xffff0304), new byte[] {0x06, 0x03, 0x04});
+ assertEqualsB(uil.encode(0xffffff04), new byte[] {0x07, 0x04});
+ assertEqualsB(uil.encode(-1), new byte[] {0x08});
+ }
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/ULongLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,51 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+public class ULongLexicoderTest extends LexicoderTest {
+
+ public void testEncoding() {
+ ULongLexicoder ull = new ULongLexicoder();
+
+ assertEqualsB(ull.encode(0l), new byte[] {0x00});
+ assertEqualsB(ull.encode(0x01l), new byte[] {0x01, 0x01});
+ assertEqualsB(ull.encode(0x1234l), new byte[] {0x02, 0x12, 0x34});
+ assertEqualsB(ull.encode(0x123456l), new byte[] {0x03, 0x12, 0x34, 0x56});
+ assertEqualsB(ull.encode(0x12345678l), new byte[] {0x04, 0x12, 0x34, 0x56, 0x78});
+ assertEqualsB(ull.encode(0x1234567890l), new byte[] {0x05, 0x12, 0x34, 0x56, 0x78, (byte) 0x90});
+ assertEqualsB(ull.encode(0x1234567890abl), new byte[] {0x06, 0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab});
+ assertEqualsB(ull.encode(0x1234567890abcdl), new byte[] {0x07, 0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd});
+ assertEqualsB(ull.encode(0x1234567890abcdefl), new byte[] {0x08, 0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef});
+
+ assertEqualsB(ull.encode(0xff34567890abcdefl), new byte[] {0x09, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef});
+ assertEqualsB(ull.encode(0xffff567890abcdefl), new byte[] {0x0a, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef});
+ assertEqualsB(ull.encode(0xffffff7890abcdefl), new byte[] {0x0b, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef});
+ assertEqualsB(ull.encode(0xffffffff90abcdefl), new byte[] {0x0c, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef});
+ assertEqualsB(ull.encode(0xffffffffffabcdefl), new byte[] {0x0d, (byte) 0xab, (byte) 0xcd, (byte) 0xef});
+ assertEqualsB(ull.encode(0xffffffffffffcdefl), new byte[] {0x0e, (byte) 0xcd, (byte) 0xef});
+ assertEqualsB(ull.encode(0xffffffffffffffefl), new byte[] {0x0f, (byte) 0xef});
+
+ assertEqualsB(ull.encode(-1l), new byte[] {16});
+ }
+
+ public void testSortOrder() {
+ // only testing non negative
+ assertSortOrder(new ULongLexicoder(), 0l, 0x01l, 0x1234l, 0x123456l, 0x12345678l, 0x1234567890l, 0x1234567890abl, 0x1234567890abcdl, 0x1234567890abcdefl,
+ Long.MAX_VALUE);
+ }
+
+}
Added: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoderTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoderTest.java?rev=1479229&view=auto
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoderTest.java (added)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/client/lexicoder/UUIDLexicoderTest.java Sun May 5 02:45:17 2013
@@ -0,0 +1,37 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.core.client.lexicoder;
+
+import java.util.ArrayList;
+import java.util.UUID;
+
+public class UUIDLexicoderTest extends LexicoderTest {
+ public void testSortOrder() {
+
+ assertSortOrder(new UUIDLexicoder(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID());
+
+ ArrayList<UUID> uuids = new ArrayList<UUID>();
+
+ for (long ms = -260l; ms < 260l; ms++) {
+ for (long ls = -2l; ls < 2; ls++) {
+ uuids.add(new UUID(ms, ls));
+ }
+ }
+
+ assertSortOrder(new UUIDLexicoder(), uuids.toArray(new UUID[0]));
+ }
+}
Modified: accumulo/trunk/docs/src/main/latex/accumulo_user_manual/chapters/table_design.tex
URL: http://svn.apache.org/viewvc/accumulo/trunk/docs/src/main/latex/accumulo_user_manual/chapters/table_design.tex?rev=1479229&r1=1479228&r2=1479229&view=diff
==============================================================================
--- accumulo/trunk/docs/src/main/latex/accumulo_user_manual/chapters/table_design.tex (original)
+++ accumulo/trunk/docs/src/main/latex/accumulo_user_manual/chapters/table_design.tex Sun May 5 02:45:17 2013
@@ -111,6 +111,50 @@ com.google.mail_201004
Appending dates provides the additional capability of restricting a scan to a given
date range.
+\section{Lexicoders}
+Since Keys in Accumulo are sorted lexicographically by default, it's often useful to encode
+common data types into a byte format in which their sort order corresponds to the sort order
+in their native form. An example of this is encoding dates and numerical data so that they can
+be better seeked or searched in ranges.
+
+The lexicoders are a standard and extensible way of encoding Java types. Here's an example
+of a lexicoder that encodes a java Date object so that it sorts lexicographically:
+
+\small
+\begin{verbatim}
+// create new date lexicoder
+DateLexicoder dateEncoder = new DateLexicoder();
+
+// truncate time to hours
+long epoch = System.currentTimeMillis();
+Date hour = new Date(epoch - (epoch % 3600000));
+
+// encode the rowId so that it is sorted lexicographically
+Mutation mutation = new Mutation(dateEncoder.encode(hour));
+mutation.put(new Text("colf"), new Text("colq"), new Value(new byte[]{}));
+\end{verbatim}
+\normalsize
+
+If we want to return the most recent date first, we can reverse the sort order
+with the reverse lexicoder:
+
+\small
+\begin{verbatim}
+// create new date lexicoder and reverse lexicoder
+DateLexicoder dateEncoder = new DateLexicoder();
+ReverseLexicoder reverseEncoder = new ReverseLexicoder(dateEncoder);
+
+// truncate date to hours
+long epoch = System.currentTimeMillis();
+Date hour = new Date(epoch - (epoch % 3600000));
+
+// encode the rowId so that it sorts in reverse lexicographic order
+Mutation mutation = new Mutation(reverseEncoder.encode(hour));
+mutation.put(new Text("colf"), new Text("colq"), new Value(new byte[]{}));
+\end{verbatim}
+\normalsize
+
+
\section{Indexing}
In order to support lookups via more than one attribute of an entity, additional
indexes can be built. However, because Accumulo tables can support any number of