PromucFlow_constructor/app/server
Shrikant Sharat Kandula 632c8a7b69
chore: use common function for building query (#31018)
The query execution methods, `queryAllExecute`, `queryOneExecute` etc.,
aren't using the same function to build the `Query` object. This PR
fixes it by using the common function.

But the common function has a problem. Check this out, this is the
current implementation:

```java
Query query = new Query();
criterias.stream().forEach(criteria -> query.addCriteria(criteria));
if (aclPermission == null) {
    query.addCriteria(new Criteria().andOperator(notDeleted()));
} else {
    query.addCriteria(new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, aclPermission)));
}

if (!isEmpty(projectionFieldNames)) {
    projectionFieldNames.stream().forEach(fieldName -> query.fields().include(fieldName));
}

return query;
```

Here, we use `addCriteria` to add each of the criteria items given to
us, into the `query`. After that, we use `.andOperator` to add the
not-deleted and permission checks.

Looks good on the surface. Let's take an example. If the given criteria
list has `fieldName = "abc"` as the condition, this will end up in the
final query as (pseudo-code representation):

```javascript
{
	fieldName: "abc",
	$and: {
		$and: {
			deleted: false or missing,
			deletedAt: null
		},
		policies: {
			$elemMatch: permission check here,
		}
	}
}
```

Perfectly working query. Now, what if the incoming criteria list is a
little more complex, and has an `or` condition in it. This is what we
end up with:

```javascript
{
	$or: {
		field1: "val",
		field2: "val"
	},
	$and: {
		$and: {
			deleted: false or missing,
			deletedAt: null
		},
		policies: {
			$elemMatch: permission check here,
		}
	}
}
```

We end up with a `$or` and `$and` next to each other. This doesn't make
sense to MongoDB.

The way the query is built in the `queryAllExecute` method previously,
actually doesn't fall into this. That's the version we're changing the
common method into now. This is what it looks like:

```java
final ArrayList<Criteria> criteriaList = new ArrayList<>(criterias);
criteriaList.add(notDeleted());

final Criteria permissionCriteria = userAcl(permissionGroups, aclPermission);
if (permissionCriteria != null) {
    criteriaList.add(permissionCriteria);
}

final Query query = new Query(new Criteria().andOperator(criteriaList.toArray(new Criteria[0])));

if (!isEmpty(projectionFieldNames)) {
    query.fields().include(projectionFieldNames.toArray(new String[0]));
}

return query;
```

With this, the resulting query looks something like this:

```javascript
{
	$and: {
		$or: {
			field1: "val",
			field2: "val"
		},
		$and: {
			deleted: false or missing,
			deletedAt: null
		},
		policies: {
			$elemMatch: permission check here,
		}
	}
}
```

This isn't new code. This is how we've been building the query for
`queryAll` today. By moving this to the common method, we have this
resilient query building for `queryOne` and `queryFirst` as well.
2024-02-12 12:58:42 +05:30
..
.run feat: Databricks plugin (#29746) 2023-12-26 10:04:09 +05:30
appsmith-git fix: Split changes for git support in apps with mi bugs (#30997) 2024-02-08 14:07:51 +05:30
appsmith-interfaces feat: expires in field added in oauth2 api datasource (#30866) 2024-02-07 18:26:21 +05:30
appsmith-plugins feat: Add knowledge retrieval in Appsmith AI (#30725) 2024-02-05 17:15:45 +05:30
appsmith-server chore: use common function for building query (#31018) 2024-02-12 12:58:42 +05:30
envs chore: Remove unused services (#30292) 2024-01-23 05:43:16 +05:30
mongo-seed
reactive-caching chore(deps): Update pf4j to v3.10.0 (#27044) 2023-09-07 08:48:45 +05:30
scripts chore: Delete unused app/server/scripts/node 2023-08-08 06:00:48 +05:30
.gitignore chore: Removed failed tests file from git (#29602) 2023-12-14 13:02:36 +05:30
build.sh
buildpack-run.sh
docker-compose.yml chore: Use new Docker image for dev-time server (#25609) 2023-07-24 09:56:30 +05:30
pom.xml chore(deps): Update commons-compress (#29943) 2024-01-09 07:26:52 +05:30
Procfile
README.md
system.properties

Appsmith Server

This is the server-side repository for the Appsmith framework.

For details on setting up your development machine, please refer to this Setup Guide.