Parse-SDK-JS icon indicating copy to clipboard operation
Parse-SDK-JS copied to clipboard

Can not combine equalTo clause with any other clause

Open sadakchap opened this issue 3 years ago • 4 comments

New Issue Checklist

Issue Description

Combining equalTo clause with any other clause seem to overwriting each other.

Steps to reproduce

let q = new Parse.Query('MyClass');
q.equalTo('age', null);
q.exists('age');
// or these
q.equalTo('age', 10);
q.greaterThan('age', 0);

Actual Outcome

getting a query like this where={age: {$exists: true}} or error in 2nd case(using greaterThan)

Expected Outcome

where={age: {$exists: true, $eq: null }} or where={age: {$gt: 0, $eq: 10 }}

Environment

Server

  • Parse Server version: 4.5.0
  • Operating system: Ubuntu
  • Local or remote host (AWS, Azure, Google Cloud, Heroku, Digital Ocean, etc): local

Database

  • System (MongoDB or Postgres): MongoDB
  • Database version: 4.4
  • Local or remote host (MongoDB Atlas, mLab, AWS, Azure, Google Cloud, etc): local

Client

  • Parse JS SDK version: 3.2.0

Logs

sadakchap avatar Jun 08 '21 13:06 sadakchap

Here's pr https://github.com/parse-community/Parse-SDK-JS/pull/1373 with a failing test case.

sadakchap avatar Jun 08 '21 13:06 sadakchap

After looking into code for equalTo, wherever we had queries like this

q.greaterThan(age, 0);
q.equalTo(age, 10); // this will override any existing query on that key
// will result in where={age: 10}

It seems like equalTo was always overriding any existing query on that key instead of adding new clause.

And when we try to apply other clauses to equalTo query,

q.equalTo(age, 10);
q.greaterThan(age, 0);

it was failing at line as equalTo gives where={age: 10} and won't be able to add any other clause.

Do guys think that it should return where={age: {$eq: 10, $gt: 0}} ? @davimacedo @mtrezza .

yes, we can directly use greaterThanOrEqual, but for other clauses, should equalTo override ?

sadakchap avatar Jun 09 '21 04:06 sadakchap

I posted this in the PHP SDK because a developer had the same idea you had or similar at almost the same time.

https://github.com/parse-community/parse-php-sdk/issues/476

I think they came up with a good solution of using this.addCondition(key, $eq, value) vs this.where[key] just wanted you to know. I’ll look into it more

dplewis avatar Jun 09 '21 04:06 dplewis

Yes, that's a very good solution! But what do you think about this scenario

q.equalTo(age, 10);
q.equalTo(age);

this will result in where={age: {$eq: 10, $exists: false}}. Do you think this make sense ?

The way queries are executed, it make sense to me. But, earlier equalTo without any compareTo value was overriding anything and giving where={age: {$exists: false}}.

test case

sadakchap avatar Jun 09 '21 05:06 sadakchap