aboutsummaryrefslogtreecommitdiffstats
path: root/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
diff options
context:
space:
mode:
Diffstat (limited to 'indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java')
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java68
1 files changed, 68 insertions, 0 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
new file mode 100644
index 00000000000..11e58883b27
--- /dev/null
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/HexDecodeExpression.java
@@ -0,0 +1,68 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.DocumentType;
+import com.yahoo.document.datatypes.LongFieldValue;
+
+import java.math.BigInteger;
+
+/**
+ * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ */
+public class HexDecodeExpression extends Expression {
+
+ private static final BigInteger ULONG_MAX = new BigInteger("18446744073709551616");
+
+ @Override
+ protected void doExecute(ExecutionContext ctx) {
+ String input = String.valueOf(ctx.getValue());
+ if (input.isEmpty()) {
+ ctx.setValue(new LongFieldValue(Long.MIN_VALUE));
+ return;
+ }
+ BigInteger output;
+ try {
+ output = new BigInteger(input, 16);
+ } catch (NumberFormatException e) {
+ throw new NumberFormatException("Illegal hex value '" + input + "'.");
+ }
+ if (output.bitLength() > 64) {
+ throw new NumberFormatException("Hex value '" + input + "' is out of range.");
+ }
+ if (output.compareTo(BigInteger.ZERO) == 1 && output.bitLength() == 64) {
+ output = output.subtract(ULONG_MAX); // flip to negative
+ }
+ ctx.setValue(new LongFieldValue(output.longValue()));
+ }
+
+ @Override
+ protected void doVerify(VerificationContext ctx) {
+ ctx.setValue(createdOutputType());
+ }
+
+ @Override
+ public DataType requiredInputType() {
+ return DataType.STRING;
+ }
+
+ @Override
+ public DataType createdOutputType() {
+ return DataType.LONG;
+ }
+
+ @Override
+ public String toString() {
+ return "hexdecode";
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof HexDecodeExpression;
+ }
+
+ @Override
+ public int hashCode() {
+ return getClass().hashCode();
+ }
+}