so this may be a separate issue or i maybe be misunderstanding expressions, but i’m getting some weird behavior when doing the post-expression, “chained” bin passing, at least with expressions.Let
here’s a full repro with
python: 3.8.10
python aerospike client: 6.0.0
aerospike image: aerospike:ce-5.6.0.9
import aerospike
from aerospike_helpers import cdt_ctx, expressions
from aerospike_helpers.operations import expression_operations
ac = aerospike.client({'hosts': [('localhost', 3000)]})
ac.connect()
key = ('test', None, 0)
ac.put(
key,
{
'bin': {
'level1': {
'level2_1': ['010101', '010102'],
'level2_2': ['010102', '010103'],
}
}
}
)
print(ac.get(key))
ac.operate(
key,
[
expression_operations.expression_write(
'bin',
expressions.Let(
expressions.Def(
'with_removed',
expressions.MapRemoveByKey(
ctx=[cdt_ctx.cdt_ctx_map_key('level1')],
key='level2_1',
bin='bin'
)
),
expressions.Cond(
expressions.Eq(
expressions.MapSize(
ctx=[cdt_ctx.cdt_ctx_map_key('level1')],
bin=expressions.Var('with_removed')
),
0
),
expressions.MapRemoveByKey(
ctx=None,
key='level1',
bin=expressions.Var('with_removed')
),
expressions.Var('with_removed')
# expressions.MapRemoveByKey(
# ctx=[cdt_ctx.cdt_ctx_map_key('level1')],
# key='level2_1',
# bin='bin'
# )
)
).compile()
)
]
)
print(ac.get(key))
and i’m gettting this output
(('test', None, None, bytearray(b'\xb3F\x13{\xa9\x18\x95y\xdaR\x01b\xdf\xdc\xd6\x1a\x10\xfe7\xd6')), {'ttl': 2592000, 'gen': 21}, {'bin': {'level1': {'level2_1': ['010101', '010102'], 'level2_2': ['010102', '010103']}}})
(('test', None, None, bytearray(b'\xb3F\x13{\xa9\x18\x95y\xdaR\x01b\xdf\xdc\xd6\x1a\x10\xfe7\xd6')), {'ttl': 2592000, 'gen': 22}, {'bin': 6.9493343797729e-310})
i observed a few things:
- using the commented out
expressions.MapRemoveByKey
(repeating the expressions.Def
) works as expected with output
(('test', None, None, bytearray(b'\xb3F\x13{\xa9\x18\x95y\xdaR\x01b\xdf\xdc\xd6\x1a\x10\xfe7\xd6')), {'ttl': 2592000, 'gen': 27}, {'bin': {'level1': {'level2_1': ['010101', '010102'], 'level2_2': ['010102', '010103']}}})
(('test', None, None, bytearray(b'\xb3F\x13{\xa9\x18\x95y\xdaR\x01b\xdf\xdc\xd6\x1a\x10\xfe7\xd6')), {'ttl': 2592000, 'gen': 28}, {'bin': {'level1': {'level2_2': ['010102', '010103']}}})
- only the non-“level1 removal path” is a problem, commenting out a level2 (to go down the level1 removal path) works as expected with output
(('test', None, None, bytearray(b'\xb3F\x13{\xa9\x18\x95y\xdaR\x01b\xdf\xdc\xd6\x1a\x10\xfe7\xd6')), {'ttl': 2592000, 'gen': 29}, {'bin': {'level1': {'level2_1': ['010101', '010102']}}})
(('test', None, None, bytearray(b'\xb3F\x13{\xa9\x18\x95y\xdaR\x01b\xdf\xdc\xd6\x1a\x10\xfe7\xd6')), {'ttl': 2592000, 'gen': 30}, {'bin': {}})
- not using a
expressions.Let
and just repeating everything within the expressions.Cond
works as expected.
is the first output a bug?