# Route shape

## Introduction

The `route` shape is used when a process flow needs to split into multiple paths, based on a given set of conditions. Conditions are defined based on any fields found in the schema associated with your source data, so the scope for using routes is huge.&#x20;

To define multiple routes for your process flow, you must:

1. Add a `route` shape.
2. Configure the `route` shape to add required routes and conditions.
3. Build the flow for each configured route by adding [shapes](https://doc.wearepatchworks.com/product-documentation/process-flows/building-process-flows/process-flow-shapes) in the usual way.

{% hint style="info" %}
A single incoming payload for [any process flow shape](https://open.gitbook.com/~site/site_dIV1g/~/revisions/9dTvdvRJIRVZQXuBMMnJ/process-flows/building-process-flows/process-flow-shapes) should not exceed 500MB.

We recommend processing multiple, smaller payloads rather than one single payload (1000 x 0.5MB payloads are more efficient than 1 x 500MB payload!).

For payloads up to 500MB, consider adding a[ flow control shape](https://open.gitbook.com/~site/site_dIV1g/~/revisions/9dTvdvRJIRVZQXuBMMnJ/process-flows/building-process-flows/process-flow-shapes/standard-shapes/flow-control-shape) to batch data into multiple, smaller payloads. Payloads exceeding 500MB should be batched at source.
{% endhint %}

## Need to know

* By default, multiple routes are processed in parallel when a process flow runs - one does not wait for another to complete before starting.&#x20;
* If a route shape is added without route conditions, incoming data flows down ALL defined routes.
* There is no limit on the number of routes that can be added for a `route` shape.&#x20;

## Accessing route shape settings

When you add a `route` shape to a process flow, the shape is added to your canvas with two placeholder route stems - for example:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FWqByWaNBciI1lfk8YDKq%2Froute%20shape%202.png?alt=media&#x26;token=27280069-e89f-4827-b1e4-2903132a60fa" alt="" width="319"><figcaption></figcaption></figure></div>

To configure these routes (and add more if needed) click the 'cog' icon associated with this shape to access [route settings](#configuring-route-data-for-a-new-route-shape).&#x20;

## Configuring route data for a new route shape

{% stepper %}
{% step %}
**Add source integration details**

Optionally, select a `source integration` and `endpoint` to determine where the incoming payload for the route shape is coming from - for example:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FnUadL9cHm47MPX7omPkI%2Froute%20shape%203.png?alt=media&#x26;token=9dd1d471-9d22-43a4-9a26-a58344a9d949" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
If you leave these fields blank, the route shape will receive whatever data is passed from the previous step in the flow.
{% endhint %}
{% endstep %}

{% step %}
**Choose a routing method**

Select a `routing method` to determine what should happen if a payload record matches conditions defined for more than one route:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2F4kOPOMjtAprshmf7yHrN%2Froute%20shape%204.png?alt=media&#x26;token=3498df0a-a8b5-4ea5-b2e8-a640e34217b4" alt="" width="375"><figcaption></figcaption></figure></div>

These options are summarised below:

| Option                           | Summary                                                                                                                              |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Follow all matching routes       | If a record matches defined conditions for multiple routes, send it for onward processing down all matched routes.                   |
| Follow first matching route only | If a record matches defined conditions for multiple routes, send it for onward processing down the first matched route, but no more. |

<details>

<summary><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FuKTXJEY34CVnak6PxrOz%2Fexample%20icon%202.svg?alt=media&#x26;token=7c8af2c5-9519-4757-bea9-172569a023bd" alt="" data-size="line"> Example</summary>

To help understand how these options are used, consider an example where two routes are defined:

* Route 1 is to send all orders where the `product_type` ordered is `shoes` to Warehouse 1
* Route 2 is to keep all orders where the `product_type` ordered is `boots` to Warehouse 2

But what should happen with an order that includes **both** shoes and boots?&#x20;

* If we choose to **follow all matching routes**, then this order will flow down both routes - ending up in the payload for Warehouse 1 and Warehouse 2.&#x20;
* If we choose to **follow first matching route only**, this order will only flow down route 1 - ending up in the payload for Warehouse 1.

</details>
{% endstep %}

{% step %}
**Set date format**&#x20;

If any of your routes are filtering by date, you can select a `date format` here:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FDLCZMgqHYMWps4G8ly0G%2Froute%20shape%20-%20date%20format.png?alt=media&#x26;token=a3a3fc30-2a03-418a-ae21-9bcd7a24ccdd" alt="" width="375"><figcaption></figcaption></figure></div>

By default, dates are expected in the form `Y-m-d H:i:s` . If yours are different, select the format from this list (a wide range of standard date formats is available).  &#x20;
{% endstep %}

{% step %}
**Set payload format (optional)**

Use the `payload format` selector to set the expected format for incoming payloads: &#x20;

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FDLCZMgqHYMWps4G8ly0G%2Froute%20shape%20-%20date%20format.png?alt=media&#x26;token=a3a3fc30-2a03-418a-ae21-9bcd7a24ccdd" alt="" width="375"><figcaption></figcaption></figure></div>

Available formats are: `Auto` (the `route` shape determines the format received), `JSON`, `XML`, `Plain`.
{% endstep %}

{% step %}
**Edit the first route**

Click the 'edit' icon associated with the first route:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FCetYSlMEtiqjXso4FDLz%2Froute%20filters%200.png?alt=media&#x26;token=d0793f1f-cc70-448f-9034-4d36402dff54" alt="" width="350"><figcaption></figcaption></figure></div>

Then enter your required name for this route - it's a good idea to ensure this indicates the route's purpose. For example:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FrSJHJqm4Sl5RBS3CPR4c%2Froute%20filters%201.png?alt=media&#x26;token=f0a71698-ecef-4424-8ad3-958afad303eb" alt="" width="355"><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}
**Set the filter operator for this route**

If you intend to define multiple rules/filters for this route, select the required operator from the `filter logic` dropdown field:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2F0rOyjPbe3f6k5NdUKQLI%2Froute%20filters%202.png?alt=media&#x26;token=5ff66080-d475-4ebb-9b05-b26504200305" alt="" width="353"><figcaption></figcaption></figure></div>

* Select `AND` so all defined filters must apply for a match
* Select `OR` so any one of the defined filters will result in a match

{% hint style="info" %}
If you only need to define one filter, just leave the default setting in place (it has no effect).
{% endhint %}
{% endstep %}

{% step %}
**Configure rules (filters) for this route**

Then click the `add new filter` button:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FWRg8jJRDGNqD43K9x63D%2Froute%20filters%203.png?alt=media&#x26;token=bdfe0193-f28d-4a41-93d4-1807fac98056" alt="" width="354"><figcaption></figcaption></figure></div>

Filter settings are displayed:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2F5bRSODgGDJy9iwu1m8Ln%2Froute%20filters%204.png?alt=media&#x26;token=3c460638-2277-4fe2-a889-ba66099ea0c2" alt="" width="536"><figcaption></figcaption></figure></div>

From here, you can select a `field` (from the `data schema` associated with the `source endpoint` selected in step 1) - for example:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FysvKOwsCNNuYOYcktgmz%2Froute%20filters%205.png?alt=media&#x26;token=b030f7fe-8630-4030-a5ee-740b2ea08f19" alt="" width="528"><figcaption></figcaption></figure></div>

Alternatively, you can toggle the manual input option to ON and add syntax for [dynamic variables](https://doc.wearepatchworks.com/product-documentation/process-flows/building-process-flows/dynamic-variables):

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2F0XIa97EntVBrZNuUxRo9%2Froute%20filter%20-%20manual%20input%201.png?alt=media&#x26;token=68c0d72b-9e30-4120-b871-2b61161037ad" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
The manual data path field supports [metadata variables](https://doc.wearepatchworks.com/product-documentation/process-flows/building-process-flows/dynamic-variables/metadata-variables).
{% endhint %}

Now, use the remaining `operator`, `type` and `value` options to define the required filter.&#x20;

{% hint style="info" %}
Presentation of the `value` field is dependent upon your selected `type`. When defining a `value`, you can include [payload](https://doc.wearepatchworks.com/product-documentation/process-flows/building-process-flows/dynamic-variables/payload-variables), [flow](https://doc.wearepatchworks.com/product-documentation/process-flows/building-process-flows/dynamic-variables/flow-variables), and [metadata](https://doc.wearepatchworks.com/product-documentation/process-flows/building-process-flows/dynamic-variables/metadata-variables) variables. &#x20;
{% endhint %}

{% hint style="info" %}
When a string filter `type` is selected, you have the option to select the `regex` operator and then define a regex value. This provides greater flexibility if you can't achieve the desired results using standard operators. `preg_match` is used for pattern matching.
{% endhint %}

The following data types are available when defining filters:

<table><thead><tr><th width="224">Variable type</th><th>Variable is defined and passed as...</th></tr></thead><tbody><tr><td>String</td><td>A string value.</td></tr><tr><td>Number</td><td>A numeric value.</td></tr><tr><td>Specific date</td><td>A selected date - choose the required date/time from a date picker.</td></tr><tr><td>Dynamic date</td><td>A <code>+</code>/<code>-</code> number of <code>seconds</code>, <code>minutes</code>, <code>hours</code>, <code>days</code>, <code>months</code>, <code>years</code> to be matched relative to the current date.</td></tr><tr><td>Boolean</td><td>A true/false value.</td></tr></tbody></table>

Use the `keep matching?` toggle option to choose how matched records should be treated:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2Fj4mol1D95soGHAwUoAMs%2Froute%20filters%206.png?alt=media&#x26;token=7402c9a4-e42e-43bc-a2f7-4e4604ee84de" alt="" width="533"><figcaption></figcaption></figure></div>

Here:

* If the `keep matching?` option is toggled `off`, matched records are removed from the payload before it moves on down the flow for further processing.
* If the `keep matching?` option is toggled `on`, matched records remain in the onward payload, and all non-matching records will be removed.
  {% endstep %}

{% step %}
**Confirm rule settings**

Click the `save` button (at the bottom of the panel) to confirm these settings. The new rule is added for your first route - for example:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FFkaATAofM8qigwYppQoy%2Froute%20filters%207.png?alt=media&#x26;token=92b2c0aa-8139-4ec6-bf38-1608ffef50e9" alt="" width="531"><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}
**Confirm route settings**

Repeat steps 7 and 8 to add any additional rules for this route. When you've added all required rules, click the `save`/`update` button at the bottom of the panel.
{% endstep %}

{% step %}
**Configure the second route**

Repeat steps 5 to 9 to configure the second route.
{% endstep %}

{% step %}
**Add more routes (optional)**

Add any additional routes required using the `add route` button. Each time you add a new route, the canvas updates with an additional route stem from your route shape.
{% endstep %}
{% endstepper %}

## What next?

Having defined all required routes and associated conditions, the `route` shape on the canvas will have the corresponding number of route stems, ready for you to add shapes. For example:

<div align="left"><figure><img src="https://2440044887-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLYNcUBVQwSkOMG6KjZfz%2Fuploads%2FZVK8DauXK6qV5jy5SvKU%2F3%20routes.png?alt=media&#x26;token=1a9eaa18-677f-4aa1-a840-b9ddf46866c6" alt="" width="310"><figcaption></figcaption></figure></div>
