OK, thanks Jan for your follow-up. So I've found 3 issues in just a week, do I qualify for a free t-shirt? :)
Cheers, Thomas On Wednesday, June 29, 2016 at 5:58:46 PM UTC+8, Jan wrote: > > After your comment I revisited the issue. It's actually right what the > docs state, so the `allowImplicit` flag belongs underneath the > `collections` attribute. > I first thought it should go on the main level, because when I tried it > made no difference. But it turned out I had some typo in my reproduce code. > > The actual reason for the issue that you were facing was different: > when specifying the list of collections for the transaction, there are the > attributes `read` and `write`. In your case, you specified the `foxxdebug` > collection as both `read` and `write`. This is kind of redundant, as > `write` includes `read` already, so using `write: "foxxdebug"` would have > been sufficient already. Adding the same collection as both read and write > seems to have an unwanted side effect, with the outcome that `read` wins. > That means when using the collection in write mode in the transaction (for > the insert operation) the transaction will complain. Adding the collection > as write-only will work however. Adding it as read-only will of course > complain intentionally when the collection is used in write mode. > So the fix clearly is that the collection should be added in write-only > mode to the transaction, and that the _executeTransaction function() should > automatically treat it like this when a collection is specified in both > `read` and `write`. I just changed that behavior in the 2.8, 3.0 and devel > branches, so that fix will be incorporated in future releases. > > Sorry for the confusion, it wasn't fully obvious to me in the beginning, > and I was convinced that `allowImplicit` belongs on the top-level, but you > were right. > Best regards > Jan > > Am Mittwoch, 29. Juni 2016 10:15:47 UTC+2 schrieb Thomas Weiss: >> >> Thanks for looking into this, so this means that there are errors in your >> docs: >> https://docs.arangodb.com/2.8/Transactions/TransactionInvocation.html >> https://docs.arangodb.com/2.8/Transactions/LockingAndIsolation.html >> >> Cheers, >> thomas >> >> On Wednesday, June 29, 2016 at 4:13:02 PM UTC+8, Jan wrote: >>> >>> Regarding the actual "allowImplicit" flag. >>> This works fine for me, however, the flag needs to be specified on the >>> topmost level of the transaction object, i.e. >>> >>> db._executeTransaction({ >>> collections: { >>> read: ['foxxdebug'], >>> write: ['foxxdebug'] >>> }, >>> allowImplicit: false, >>> action: function () { >>> ... >>> }); >>> >>> I think in your code example the flag is set in some nested level, >>> inside the "collections" attribute, from where it will not be picked up. >>> >>> Best regards >>> Jan >>> >>> >>> >>> Am Mittwoch, 29. Juni 2016 04:51:51 UTC+2 schrieb Thomas Weiss: >>>> >>>> Hi Jan, >>>> >>>> It seems that this is the exact same answer to an other issue I >>>> reported, but I don't think the issues are related. >>>> >>>> Thanks, >>>> Thomas >>>> >>>> On Tuesday, June 28, 2016 at 8:57:13 PM UTC+8, Jan wrote: >>>>> >>>>> Hi Thomas, >>>>> >>>>> I used your code to reproduce the issue and it's partly related. >>>>> The problem in this case is not that there are immutable objects, but >>>>> that the call to `byExample(...).count()` returns an unexpected value. >>>>> >>>>> var fromCount1 = db.foxxdebug.byExample({ _from: from, request: false >>>>> }).count(); >>>>> >>>>> The `byExample()` returns an object of type `SimpleQueryByExample`, >>>>> and when calling `toArray()` on this, the results are correct, before and >>>>> after the update. >>>>> However, when calling `count()` on that object, this will also >>>>> correctly execute the simple query, but sometimes returns a wrong result >>>>> for `count`. The reason for this is that internally the result is >>>>> produced >>>>> by an index lookup and then may need to be post-filtered in order to >>>>> return >>>>> only those documents that match all conditions. In this case, the >>>>> byExample >>>>> will use the edge index on `_from` and then post-filter the result using >>>>> the `request == false` condition. The result of post-filtering is also >>>>> correct, however, the `count` value of the query is not adjusted. `count` >>>>> in this case will return the number of documents before post-filtering. >>>>> >>>>> In your case the number of documents with the queried `_from` and >>>>> `_to` values don't change due to the replace, so the `count` values >>>>> before >>>>> and after the replace are identical. Clearly it's a bug that the count >>>>> value is wrong, and I just fixed it in the 2.8 branch. I checked that >>>>> it's >>>>> already working fine in 3.0, and 2.8 is the last affected version. >>>>> >>>>> By the way, the workaround to prevent the issue from occurring is to >>>>> not use `byExample(...).count()` but instead use >>>>> `byExample(...).toArray().length`. >>>>> We plan to build a new 2.8 release this week end. >>>>> >>>>> Best regards >>>>> Jan >>>>> >>>>> Am Freitag, 24. Juni 2016 15:11:53 UTC+2 schrieb Thomas Weiss: >>>>>> >>>>>> Hi there, >>>>>> >>>>>> I was debugging a different topic in my Foxx app and decided to give >>>>>> the 'allowImplicit' flag a try (to make sure that all the collections I >>>>>> read in my transactions were declared). But I found that, even if all >>>>>> collections are declared, adding this flag would raise an error. Here is >>>>>> a >>>>>> simple example to reproduce that (tested on 2.8.7): >>>>>> >>>>>> controller.post('/foxxdebug', function (req, res) { >>>>>> var from = 'foxxdebug/123'; >>>>>> var to = 'foxxdebug/456'; >>>>>> db._executeTransaction({ >>>>>> collections: { >>>>>> read: ['foxxdebug'], >>>>>> write: ['foxxdebug'], >>>>>> allowImplicit: false >>>>>> }, >>>>>> action: function () { >>>>>> db.foxxdebug.insert(from, to, {}); >>>>>> var fromCount = db.foxxdebug.byExample({ _from: from }). >>>>>> count(); >>>>>> var toCount = db.foxxdebug.byExample({ _to: to }).count >>>>>> (); >>>>>> res.json({ fromCount: fromCount, toCount: toCount }); >>>>>> } >>>>>> }); >>>>>> }); >>>>>> >>>>>> Note that the 'foxxdebug' was created, but this call would always >>>>>> fail with the 'unregistered collection used in transaction' error! >>>>>> >>>>>> Thomas >>>>>> >>>>> -- You received this message because you are subscribed to the Google Groups "ArangoDB" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
