Beispiel #1
0
    public static byte[] EncodeInt128(KuduInt128 value)
    {
        var buffer = new byte[16];

        EncodeInt128(buffer, value);
        return(buffer);
    }
Beispiel #2
0
    [InlineData(-667386670618854952, 7376056636151202432, 35)] //-123.1111111111111111111111111111
    public void KuduDecimalTooLarge(long high, ulong low, int scale)
    {
        var value = new KuduInt128(high, low);

        Assert.Throws <OverflowException>(
            () => DecimalUtil.DecodeDecimal128(value, scale));
    }
Beispiel #3
0
    public static KuduInt128 MaxDecimal128(int precision)
    {
        if (precision > MaxDecimal128Precision)
        {
            throw new ArgumentOutOfRangeException(nameof(precision),
                                                  $"Max precision for decimal128 is {MaxDecimal128Precision}");
        }

        return(KuduInt128.PowerOf10(precision) - 1);
    }
Beispiel #4
0
    public static decimal DecodeDecimal128(KuduInt128 value, int scale)
    {
        var  abs       = value.Abs();
        int  low       = (int)(abs.Low & uint.MaxValue);
        int  mid       = (int)(abs.Low >> 32);
        int  high      = (int)(abs.High & uint.MaxValue);
        uint extraHigh = (uint)(abs.High >> 32);

        if (extraHigh > 0)
        {
            throw new OverflowException("Kudu decimal is too large for .NET decimal. " +
                                        "Use GetRawFixed to read the raw value.");
        }

        return(new decimal(low, mid, high, value < 0, (byte)scale));
    }
Beispiel #5
0
    public static KuduInt128 EncodeDecimal128(decimal value, int targetPrecision, int targetScale)
    {
        var dec   = new DecimalAccessor(value);
        var scale = (int)dec.Scale;

        CheckConditions(value, scale, targetPrecision, targetScale);

        int scaleAdjustment = targetScale - scale;
        var maxValue        = KuduInt128.PowerOf10(targetPrecision - scaleAdjustment) - 1;
        var unscaledValue   = new KuduInt128(dec.Low, dec.Mid, dec.High, 0);

        if (unscaledValue > maxValue)
        {
            ThrowValueTooBig(value, targetPrecision);
        }

        var factor = KuduInt128.PowerOf10(scaleAdjustment);
        var result = unscaledValue * factor;

        return(dec.IsNegative ? result.Negate() : result);
    }
Beispiel #6
0
    /// <summary>
    /// Increments the column at the given index, returning false if the
    /// value is already the maximum.
    /// </summary>
    /// <param name="index">The column index to increment.</param>
    internal bool IncrementColumn(int index)
    {
        if (!IsSet(index))
        {
            throw new ArgumentException($"Column index {index} has not been set.");
        }

        ColumnSchema column = Schema.GetColumn(index);

        if (column.IsFixedSize)
        {
            KuduType    type = column.Type;
            Span <byte> data = GetRowAllocColumn(index, column.Size);

            switch (type)
            {
            case KuduType.Bool:
            {
                bool isFalse = data[0] == 0;
                data[0] = 1;
                return(isFalse);
            }

            case KuduType.Int8:
            {
                sbyte existing = KuduEncoder.DecodeInt8(data);
                if (existing == sbyte.MaxValue)
                {
                    return(false);
                }

                KuduEncoder.EncodeInt8(data, (sbyte)(existing + 1));
                return(true);
            }

            case KuduType.Int16:
            {
                short existing = KuduEncoder.DecodeInt16(data);
                if (existing == short.MaxValue)
                {
                    return(false);
                }

                KuduEncoder.EncodeInt16(data, (short)(existing + 1));
                return(true);
            }

            case KuduType.Int32:
            {
                int existing = KuduEncoder.DecodeInt32(data);
                if (existing == int.MaxValue)
                {
                    return(false);
                }

                KuduEncoder.EncodeInt32(data, existing + 1);
                return(true);
            }

            case KuduType.Date:
            {
                int existing = KuduEncoder.DecodeInt32(data);
                if (existing == EpochTime.MaxDateValue)
                {
                    return(false);
                }

                KuduEncoder.EncodeInt32(data, existing + 1);
                return(true);
            }

            case KuduType.Int64:
            case KuduType.UnixtimeMicros:
            {
                long existing = KuduEncoder.DecodeInt64(data);
                if (existing == long.MaxValue)
                {
                    return(false);
                }

                KuduEncoder.EncodeInt64(data, existing + 1);
                return(true);
            }

            case KuduType.Float:
            {
                float existing    = KuduEncoder.DecodeFloat(data);
                float incremented = existing.NextUp();
                if (existing == incremented)
                {
                    return(false);
                }

                KuduEncoder.EncodeFloat(data, incremented);
                return(true);
            }

            case KuduType.Double:
            {
                double existing    = KuduEncoder.DecodeDouble(data);
                double incremented = existing.NextUp();
                if (existing == incremented)
                {
                    return(false);
                }

                KuduEncoder.EncodeDouble(data, incremented);
                return(true);
            }

            case KuduType.Decimal32:
            {
                int existing  = KuduEncoder.DecodeInt32(data);
                int precision = column.TypeAttributes !.Precision.GetValueOrDefault();
                if (existing == DecimalUtil.MaxDecimal32(precision))
                {
                    return(false);
                }

                KuduEncoder.EncodeInt32(data, existing + 1);
                return(true);
            }

            case KuduType.Decimal64:
            {
                long existing  = KuduEncoder.DecodeInt64(data);
                int  precision = column.TypeAttributes !.Precision.GetValueOrDefault();
                if (existing == DecimalUtil.MaxDecimal64(precision))
                {
                    return(false);
                }

                KuduEncoder.EncodeInt64(data, existing + 1);
                return(true);
            }

            case KuduType.Decimal128:
            {
                KuduInt128 existing  = KuduEncoder.DecodeInt128(data);
                int        precision = column.TypeAttributes !.Precision.GetValueOrDefault();
                if (existing == DecimalUtil.MaxDecimal128(precision))
                {
                    return(false);
                }

                KuduEncoder.EncodeInt128(data, existing + 1);
                return(true);
            }

            default:
                throw new Exception($"Unsupported data type {type}");
            }
        }
        else
        {
            // Column is either string, binary, or varchar.
            ReadOnlySpan <byte> data = GetVarLengthColumn(index);
            var incremented          = new byte[data.Length + 1];
            data.CopyTo(incremented);
            WriteBinary(index, incremented);
            return(true);
        }
    }
Beispiel #7
0
    /// <summary>
    /// Sets the column to the minimum possible value for the column's type.
    /// </summary>
    /// <param name="index">The index of the column to set to the minimum.</param>
    internal void SetMin(int index)
    {
        ColumnSchema column = Schema.GetColumn(index);
        KuduType     type   = column.Type;

        switch (type)
        {
        case KuduType.Bool:
            WriteBool(index, false);
            break;

        case KuduType.Int8:
            WriteSByte(index, sbyte.MinValue);
            break;

        case KuduType.Int16:
            WriteInt16(index, short.MinValue);
            break;

        case KuduType.Int32:
            WriteInt32(index, int.MinValue);
            break;

        case KuduType.Date:
            WriteInt32(index, EpochTime.MinDateValue);
            break;

        case KuduType.Int64:
        case KuduType.UnixtimeMicros:
            WriteInt64(index, long.MinValue);
            break;

        case KuduType.Float:
            WriteFloat(index, float.MinValue);
            break;

        case KuduType.Double:
            WriteDouble(index, double.MinValue);
            break;

        case KuduType.Decimal32:
            WriteInt32(index, DecimalUtil.MinDecimal32(
                           column.TypeAttributes !.Precision.GetValueOrDefault()));
            break;

        case KuduType.Decimal64:
            WriteInt64(index, DecimalUtil.MinDecimal64(
                           column.TypeAttributes !.Precision.GetValueOrDefault()));
            break;

        case KuduType.Decimal128:
        {
            KuduInt128 min = DecimalUtil.MinDecimal128(
                column.TypeAttributes !.Precision.GetValueOrDefault());
            Span <byte> span = GetSpanInRowAllocAndSetBitSet(index, 16);
            KuduEncoder.EncodeInt128(span, min);
            break;
        }

        case KuduType.String:
        case KuduType.Varchar:
            WriteString(index, string.Empty);
            break;

        case KuduType.Binary:
            WriteBinary(index, Array.Empty <byte>());
            break;

        default:
            throw new Exception($"Unsupported data type {type}");
        }
    }
Beispiel #8
0
 public static void EncodeInt128(Span <byte> destination, KuduInt128 value)
 {
     BinaryPrimitives.WriteUInt64LittleEndian(destination, value.Low);
     BinaryPrimitives.WriteInt64LittleEndian(destination.Slice(8), value.High);
 }