strolch-website/content/documentation/searches.md

100 lines
3.7 KiB
Markdown
Raw Normal View History

2021-07-11 20:36:03 +02:00
---
title: 'Searches'
weight: 80
---
## Searches
As is custom for every framework, querying, or searching, the model must be
possible. Strolch searches are implemented using the `StrolchSearch` class and
one of its concrete implementations: `ResourceSearch`, `OrderSearch`,
`ActivitySearch`.
A Strolch element always has two identifiers: `Type` and `Id`. The type is
important as it classifies an element. So if a car and a house would be modelled
in Strolch, then those would both be a `Resource`, but one of type `Car`
and the other of type `House`. Both would have different parameters. Thus when
searching for objects, the first thing to do is define the type of object being
searched.
The Strolch search API is very expressive and offers multiple ways to perform
the same search. The search API consists of three components: The search
classes, the search expressions and the search predicates. The concept was taken
from the [Apache Camel](https://camel.apache.org/) project.
There are four main search classes:
* RootElementSearch - search for any of Resource, Order or Activity elements
* ResourceSearch - search for Resources
* OrderSearch - search for Orders
* ActivitySearch - search for Activities
No search is useful without a `where` clause, which are called search
expressions. When writing a search, there are multiple ways to add such where
clauses. Either
* override the `define()`-method in your sub class and add the where clauses by
calling the `where()` method, or
* define special methods on the class e.g. `byColor()` which also calls the
`where()`-method to add a search expression, or
* directly call the `where()`-method after instantiating a search.
When extending the class, then the search expressions are available as methods
on the super class, otherwise you can statically import them from
[ExpressionsSupport](https://github.com/4treesCH/strolch/blob/develop/li.strolch.agent/src/main/java/li/strolch/search/ExpressionsSupport.java)
.
And of course a where clause needs operators, which are called search
predicates. Just as search expressions are available in sub classes, so are
search predicates and can also be statically imported through
[PredicatesSupport](https://github.com/4treesCH/strolch/blob/develop/li.strolch.agent/src/main/java/li/strolch/search/PredicatesSupport.java)
.
Examples of search expressions with search predicates follow:
```java
ResourceSearch search=new ResourceSearch();
// predicate either as parameter, or chained
search.where(id().isEqualTo("myId"));
search.where(id(isEqualTo("myId")));
// negating
search.where(id(isEqualTo("myId")).not());
search.where(param("bagId","paramId").isIn(Arrays.asList("red","blue","green")));
search.where(paramNull("bagId","paramId")));
// boolean operations
search.where(id(isEqualTo("myId")) //
.or(name(isEqualTo("myName"))));
```
Note how the predicates can be chained to the search expression, or passed as a
parameter to the expression.
In addition to using predefined search search expressions, one can also just
pass a lambda expression which performs a custom filter:
```java
personSearch.where(person -> person.getName().length() == 3);
```
See
the [StrolchSearchTest](https://github.com/4treesCH/strolch/blob/develop/li.strolch.agent/src/test/java/li/strolch/search/StrolchSearchTest.java)
for many ways in which you can implement tests.
{{% notice tip %}} Note that strolch searches requires privileges, thus when you
use a strolch search, add it to the role of the user in `PrivilegeRoles.xml`:
{{% /notice %}}
```xml
<Privilege name="li.strolch.search.StrolchSearch" policy="DefaultPrivilege">
<Allow>internal
</Allow> <!-- internal used for when the search is done in an internal service -->
<Allow>li.strolch.bookshop.search.BookSearch</Allow>
</Privilege>
```