Aerospike - Проверить / увеличить значение NIL в списке? - PullRequest
2 голосов
/ 30 января 2020

Если я запускаю этот код, он увеличивает любое значение, присутствующее в индексе 7, если какой-либо из индексов до 7 не присутствует, он просто помещает NIL в качестве значения

Код

Operation operation = ListOperation.increment( "incre", 7 );
client.operate( policy, key, operation );

AQL

aql> select * from test.users
+----+----------------------------------------+
| PK | incre                                  |
+----+----------------------------------------+
| 2  | LIST('[1, 1, 1, 2, 1, 1, NIL, 1]') |
+----+----------------------------------------+
1 row in set (0.095 secs)

Как видите, индекс 6 не существует, поэтому аэроспайк автоматически ставит NIL на его место. Если я пытаюсь увеличить индекс 6, я получаю эту ошибку.

Exception in thread "main" com.aerospike.client.AerospikeException: Error 4,1,30000,0,0,BB955892AFD8CA0 127.0.0.1 3000: Parameter error

Мои вопросы: -

1) Можно ли поставить любое значение по умолчанию вместо NIL для индексов, которые не существует? Если нет способа проверить NIL, можно ли увеличить NIL?

2) Есть ли способ проверить значение NIL перед его увеличением?

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Операция приращения предполагает, что тип данных является целым числом. Таким образом, когда вы пытаетесь увеличить позицию в позиции 7, а там еще нет элемента, она начинается с целого числа 0 и увеличивается до 1. Однако, как вы заметили, шестая позиция заполняется NIL, поскольку список должен быть непрерывным. Теперь проблема в том, что NIL не является целым числом. Таким образом, вы не можете увеличить его.

Чтобы ответить на ваши конкретные c вопросы:

  1. Нет, заполнить указанным c значением по умолчанию невозможно.
  2. Вы можете прочитать элемент в позиции, которую вы можете использовать с помощью getType () класса Value, чтобы узнать, имеет ли элемент нулевой тип.
2 голосов
/ 02 февраля 2020

Вы можете избежать использования такого списка, используя флаг LIST_WRITE_INSERT_BOUNDED как часть политики операции со списком. Такая операция выдает определенный c код ошибки 26. Например (Python):

from __future__ import print_function
import aerospike
import sys
from aerospike_helpers.operations import list_operations as lh

config = {"hosts": [("127.0.0.1", 3000)]}

try:
    client = aerospike.client(config).connect()
except e.ClientError:
    print("Error: {0} [{1}]".format(e.msg, e.code))
    sys.exit(1)

key = ("test", "example", "here")

try:
    client.remove(key)
except:
    pass

try:
    ops = [
        # increment the seventh element of a non-existent record with boundary
        # restriction
        lh.list_increment(
            "incre", 7, 2, {"write_flags": aerospike.LIST_WRITE_INSERT_BOUNDED}
        )
    ]
    k, m, b = client.operate(key, ops)
except Exception as e:
    print("Error: {0} [{1}]".format(e.msg, e.code))
    print("Could not increment outside the boundary, in this case no record\n")

# try again, without limit on inserting into the bounds of the list
try:
    ops = [
        # increment the seventh element of a non-existent record
        lh.list_increment(
            "incre", 7, 2, {}
        )
    ]
    k, m, b = client.operate(key, ops)
    (key, meta, bins) = client.get(key)
    print(bins)

    ops = [
        # increment the sixth element of the newly created record
        lh.list_increment(
            "incre", 6, 1, {}
        )
    ]
    k, m, b = client.operate(key, ops)
except Exception as e:
    print("Error: {0} [{1}]".format(e.msg, e.code))
    print("Can't increment a None (NIL) value\n")

client.close()

, который выдает

Error: 127.0.0.1:3000 AEROSPIKE_ERR_OP_NOT_APPLICABLE [26]
Could not increment outside the boundary, in this case no record

{'incre': [None, None, None, None, None, None, None, 2]}
Error: 127.0.0.1:3000 AEROSPIKE_ERR_REQUEST_INVALID [4]
Can't increment a None (NIL) value

В клиенте Java это это ListWriteFlag.INSERT_BOUNDED флаг ListPolicy.

Но на самом деле, если у вас есть кортеж, где позиции 0-6 имеют специфику c это означает, что вы должны инициализировать корзину с [0, 0, 0, 0, 0, 0, 0].

...