# Execute\_udf\_on\_query does not give any data

**URL:** <https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132>\
**Category:** Ruby Client\
**Created:** [April 8, 2019, 3:50am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132 "2019-04-08T03:50:51Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dorijan\_Jelincic](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/dorijan_jelincic/32/1110_2.png) [@Dorijan\_Jelincic](https://discuss.aerospike.com/u/Dorijan_Jelincic)\
**Post date:** [April 8, 2019, 3:50am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132/1 "2019-04-08T03:50:51Z")

</div>

Hi, I am trying to stream some data but if I use execute\_udf\_on\_query before the query, I always get 0 entries.

```
task = $client.register_udf_from_file("as_lua/ordermaker.lua", "ordermaker.lua", language=Aerospike::Language::LUA, options={})

stmt = Statement.new(Rails.application.config.aerospikeNS, "orders")
stmt.filters << Filter.Equal('tokenAddress', tokenAddress)
task = $client.execute_udf_on_query(stmt, 'ordermaker', 'from_maker', [makeraddress])
task.wait_till_completed

rs = $client.query(stmt,options = {})

rs.each { |rec| puts rec.bins.inspect }

```

I am not sure what am I doing wrong? when in aql I got ok data and if I left out execute\_udf\_on\_query I also get results.

Thank you

---

<div class="post-metadata">

**Author:** ![Jan](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/jan/32/1124_2.png) [@Jan](https://discuss.aerospike.com/u/Jan)\
**Post date:** [April 8, 2019, 4:19am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132/2 "2019-04-08T04:19:49Z")

</div>

The `Client#execute_udf_on_query` function unfortunately modifies the query statement that you pass in as an argument:

```auto
    def execute_udf_on_query(statement, package_name, function_name, function_args=[], options = nil)
      ...
      statement.set_aggregate_function(package_name, function_name, function_args, false)
      ...
    end

```

Hence when you reuse the statement in the next query, it will again execute your UDF and not return the expected results.

For now, please create a new query statement for the 2nd query.

I’ve filed a ticket against the client to not modify the passed in statement here: [Client#execute\_udf\_on\_query should not modify the statement argument · Issue #79 · aerospike/aerospike-client-ruby · GitHub](https://github.com/aerospike/aerospike-client-ruby/issues/79). But I don’t intend to release a new client version for this immediately.

---

<div class="post-metadata">

**Author:** ![Dorijan\_Jelincic](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/dorijan_jelincic/32/1110_2.png) [@Dorijan\_Jelincic](https://discuss.aerospike.com/u/Dorijan_Jelincic)\
**Post date:** [April 8, 2019, 5:10am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132/3 "2019-04-08T05:10:59Z")

</div>

Thank you, so what would look like execute\_udf\_on\_query statement? something like this?

```
stmt = Statement.new(Rails.application.config.aerospikeNS, "orders")
task = $client.execute_udf_on_query(stmt, 'ordermaker', 'from_maker', [makeraddress])
task.wait_till_completed

rs = $client.query(stmt,options = {})
rs.each { |rec| puts rec.bins.inspect }

```

---

<div class="post-metadata">

**Author:** ![Jan](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/jan/32/1124_2.png) [@Jan](https://discuss.aerospike.com/u/Jan)\
**Post date:** [April 8, 2019, 6:10am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132/4 "2019-04-08T06:10:05Z")

</div>

The statement can be the same as before. You just have to create a new `Statement` instance for the 2nd query and cannot reuse the instance you passed to the `execute_udf_on_query` method:

```ruby
stmt = Statement.new(Rails.application.config.aerospikeNS, "orders")
stmt.filters << Filter.Equal('tokenAddress', tokenAddress)
task = $client.execute_udf_on_query(stmt, 'ordermaker', 'from_maker', [makeraddress])
task.wait_till_completed

stmt = Statement.new(Rails.application.config.aerospikeNS, "orders")
stmt.filters << Filter.Equal('tokenAddress', tokenAddress)
rs = $client.query(stmt)
rs.each { |rec| puts rec.bins.inspect }

```

---

<div class="post-metadata">

**Author:** ![Dorijan\_Jelincic](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/dorijan_jelincic/32/1110_2.png) [@Dorijan\_Jelincic](https://discuss.aerospike.com/u/Dorijan_Jelincic)\
**Post date:** [April 8, 2019, 6:40am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132/5 "2019-04-08T06:40:23Z")

</div>

Thank you, but it does not seems to work, as only the second filter is applied (udf filter is not applied). Maybe the problem is that result of udf filter is map? MAP('{“maker”:“…”})

---

<div class="post-metadata">

**Author:** ![Jan](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/jan/32/1124_2.png) [@Jan](https://discuss.aerospike.com/u/Jan)\
**Post date:** [April 8, 2019, 8:57am UTC](https://discuss.aerospike.com/t/execute-udf-on-query-does-not-give-any-data/6132/6 "2019-04-08T08:57:46Z")

</div>

I’m not sure what you mean.

The `client.execute_udf_on_query()` command applies a Record UDF to each record that matches the query statement filter. It is meant to update/create records as a background operation on the server. This command does not return any data. See [https://www.aerospike.com/docs/guide/record\_udf.html](https://www.aerospike.com/docs/guide/record_udf.html).

The second `client.query()` command should match the same set of records as the first command (since the same query filter is applied), and return the data to the application. There is no UDF filter applied in this command.
