> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bagofwords.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Infor OLAP

> Connect Infor d/EPM OLAP cubes over the XMLA Provider and query them with MDX

Bag of words connects to the **Infor d/EPM OLAP XMLA Provider** — the supported entry point for on-premise Infor OLAP / Infor BI (25.x), since native connections were removed — discovers the cubes in each OLAP database, and runs **MDX** against them.

<Note>
  The Infor OLAP connector is part of the **Enterprise Edition**.
</Note>

## How it works

XMLA is a SOAP-over-HTTP protocol. Bag of words posts to the endpoint you configure and:

1. Lists catalogs (OLAP databases) with a `DBSCHEMA_CATALOGS` Discover.
2. Lists cubes per catalog (`MDSCHEMA_CUBES`), then their hierarchies (`MDSCHEMA_HIERARCHIES`) and measures (`MDSCHEMA_MEASURES`).
3. Executes MDX at query time (XMLA `Execute`, `Format=Tabular`).

Each cube becomes a schema table named `Catalog/Cube` (for example `Finance/GL`), whose columns are dimension hierarchies (`dtype="dimension"`) and measures (`dtype="measure"`). The MDX unique name for every column is carried in `metadata.unique_name`.

**Two things are specific to Infor and worth understanding before you configure anything:**

**The application identity travels inside the XMLA request.** Infor database workers authenticate from `UserName`, `Password`, and `Tenant` properties in each request's XMLA `PropertyList` — not from HTTP Basic. Bag of words sends both: HTTP Basic reaches the endpoint, and the XMLA properties establish the Infor application identity. Sending Basic alone reaches the worker but leaves the username empty, which the worker rejects.

**Farms route through a manager.** Infor's documented connection flow is to send `DISCOVER_DATASOURCES` to the **OLAP Service Manager** at `http(s)://<server>:<manager_port>/BI/APP/SOAP/OLAPDB`. The response lists each database with the URL of the **Database Worker** that serves it, and all subsequent traffic goes to that worker URL. Enable **Manager discovery** to have Bag of words perform this bootstrap on connect.

## Before you start

* Decide which endpoint you have: a **Database Worker** XMLA URL (point at it directly) or the **OLAP Service Manager** URL (enable manager discovery). Worker endpoint paths are farm-specific; the manager endpoint is the documented, stable entry point.
* The Bag of words backend host must reach that URL. The connector posts to the exact URL configured — no path discovery, no redirect handling.
* An Infor EPM user with read access to the OLAP database.
* Know your **Tenant** value (`single` on single-tenant farms) and whether the datasource is advertised as **Secured** — manager discovery matches on both.
* For **ION API Gateway** routing, a backend-service `.ionapi` credentials file for an authorized application. You will need its `pu` + `ot` (token URL), `ci` (client ID), and `cs` (client secret) values.

<Tip>
  Farm-side verification of the registered listeners is `netsh http show servicestate view=requestq` on the OLAP application server. A live XMLA endpoint answers `GET` with **405** (it is POST-only); Windows HTTP.sys answers an unregistered path with a **404** carrying `Server: Microsoft-HTTPAPI/2.0` — that combination means right machine, wrong path.
</Tip>

## Step 1 — Choose the endpoint

<Tabs>
  <Tab title="Direct worker">
    Set **Endpoint URL** to the Database Worker's XMLA URL and leave **Manager discovery** off. Use this when you already know the worker URL and it is reachable from the backend.
  </Tab>

  <Tab title="Manager discovery (farms)">
    Set **Endpoint URL** to the OLAP Service Manager:

    ```text theme={null}
    http(s)://<server>:<manager_port>/BI/APP/SOAP/OLAPDB
    ```

    Turn **Manager discovery** on. On connect, Bag of words sends `DISCOVER_DATASOURCES` (carrying `Tenant`, the `Secured` value, and — if you set **Catalog** — a `Databasename` restriction), picks the matching database, and switches to its worker URL. **Test Connection** reports the resolved worker URL so you can confirm what it picked.

    If the manager hosts more than one database, you must set **Catalog**; otherwise the connection fails with the list of available database names.
  </Tab>
</Tabs>

## Step 2 — Handle worker host rewriting

Farms advertise **internal** machine names in the worker URLs they return, and those names rarely resolve from outside the farm. **Rewrite worker host** is on by default: the hostname in the discovered worker URL is replaced with the host from the endpoint URL you configured (the worker is reached at the same address the manager was), keeping the discovered path and port.

Turn it off only when workers genuinely run on different machines whose hostnames the backend can resolve.

## Step 3 — (Optional) Route through ION API Gateway

When the OLAP farm is fronted by ION API Gateway or another reverse proxy, the worker paths returned by manager discovery have to be mapped onto the external route.

<Steps>
  <Step title="Set the external worker base">
    Put the API-suite route that sits in front of `/BI/APP/SOAP/OLAPDB` into **Worker URL base**. It must be an absolute URL. The path returned by discovery is appended to it, and the scheme and host of that base win — which is what makes an HTTPS gateway route survive in front of an HTTP OLAP farm.
  </Step>

  <Step title="Switch the credentials to ION API Gateway">
    Choose the **ION API Gateway** authentication mode and fill it from the backend-service `.ionapi` file: `pu` + `ot` form the token URL, `ci` is the client ID, `cs` is the client secret. Bag of words performs an OAuth **client-credentials** grant, caches the token until shortly before it expires, sends it as a bearer token on every XMLA call, and retries once with a fresh token if the gateway answers HTTP 401.
  </Step>

  <Step title="Keep the EPM user">
    The gateway credentials authenticate the *route*, not the OLAP user. The Infor username and password are still required and still travel in the XMLA `PropertyList` on every worker request.
  </Step>
</Steps>

<Note>
  Set **Secured** to match the value `DISCOVER_DATASOURCES` advertises for the datasource. It describes the Infor datasource itself — not the transport — so it stays as the farm reports it even when an HTTPS gateway fronts an HTTP OLAP farm.
</Note>

## Connect in Bag of words

Go to **Data Sources → Add data source → Infor OLAP** and fill in the form.

| Field                 | Required | Default   | Notes                                                                                                                                                                     |
| :-------------------- | :------- | :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `host`                | Yes      | —         | A Database Worker XMLA URL, or — with manager discovery on — the OLAP Service Manager endpoint `http(s)://<server>:<manager_port>/BI/APP/SOAP/OLAPDB`.                    |
| `catalog`             | No       | *(empty)* | OLAP catalog/database to scope discovery to. Leave blank to list all accessible catalogs. Required when the manager hosts more than one database.                         |
| `manager_discovery`   | No       | `false`   | Treat the URL as the OLAP Service Manager and resolve the database's worker URL via `DISCOVER_DATASOURCES`. Leave off when the URL already points at a worker.            |
| `rewrite_worker_host` | No       | `true`    | Replace the hostname in discovered worker URLs with the host from the endpoint URL. Disable only when workers run on other machines with resolvable hostnames.            |
| `worker_url_base`     | No       | *(empty)* | External base URL for mapping worker paths through ION API Gateway or a reverse proxy. Specify the API-suite route that precedes `/BI/APP/SOAP/OLAPDB`. Must be absolute. |
| `tenant`              | No       | `single`  | XMLA `Tenant` property sent during manager discovery and on every worker request.                                                                                         |
| `secured`             | No       | `false`   | Match the `Secured` value advertised by `DISCOVER_DATASOURCES`.                                                                                                           |
| `verify_ssl`          | No       | `true`    | Verify the TLS certificate when calling the XMLA endpoint.                                                                                                                |
| `timeout_sec`         | No       | `60`      | HTTP timeout for XMLA calls, in seconds.                                                                                                                                  |

**Test Connection** authenticates, lists catalogs, and — when a catalog is configured — also lists that catalog's cubes on the resolved worker, so a manager-only success cannot mask an unreachable worker. When manager discovery resolved a worker, the message includes the worker URL it will use.

## Authentication modes

| Mode                    | Scope               | Fields                                                                                                                                                                                                                                         |
| :---------------------- | :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Username / Password** | System and per-user | `username`, `password` — the Infor OLAP user. Sent in the XMLA worker `PropertyList`; direct connections also use HTTP Basic.                                                                                                                  |
| **ION API Gateway**     | System only         | `username`, `password` (as above) plus `gateway_token_url` (from `pu` + `ot`), `gateway_client_id` (`ci`), `gateway_client_secret` (`cs`), and optional `gateway_scope` (space-separated OAuth scopes assigned to the authorized application). |

**Username / Password** can be shared (one admin-supplied EPM account for everyone) or per-user, where each person supplies their own Infor credentials so the OLAP server applies their own access.

**ION API Gateway** is system-scope only — the gateway client is a shared backend-service identity, so this mode always runs on one shared credential.

<Note>
  Per-user authentication on database-style connectors requires an Enterprise license. See [Authentication](/data-sources/authentication).
</Note>

## Troubleshooting

<AccordionGroup>
  <Accordion title="HTTP 404 — 'nothing serves XMLA at this URL path'">
    The host answered but nothing serves XMLA there. If the 404 carries `Server: Microsoft-HTTPAPI/2.0`, the message adds the documented hint: point the URL at the OLAP Service Manager (`http(s)://<server>:<manager_port>/BI/APP/SOAP/OLAPDB`) and enable manager auto-discovery. Worker paths are farm-specific — verify the registered listeners on the OLAP app server.
  </Accordion>

  <Accordion title="'Multiple databases found on the manager'">
    Manager discovery returned more than one database and cannot choose. Set **Catalog** to one of the names listed in the error.
  </Accordion>

  <Accordion title="'Database X not found on the manager'">
    The **Catalog** value does not match any database the manager advertises. The error lists the available names; database names are matched case-sensitively first, then case-insensitively.
  </Accordion>

  <Accordion title="'Manager discovery returned no databases'">
    `DISCOVER_DATASOURCES` came back empty. Check **Tenant**, **Catalog**, **Secured**, and that the user has access to the application — all four restrict the response.
  </Accordion>

  <Accordion title="Discovery fails with an empty username, or Infor error 1042">
    An empty application username means the worker got the request without the XMLA identity properties. Error `1042` means the worker parsed the identity and rejected the credential — check the Infor EPM username and password, not the transport.
  </Accordion>

  <Accordion title="The resolved worker hostname does not resolve">
    The farm advertised an internal machine name. Keep **Rewrite worker host** on so the configured host is substituted back in, or set **Worker URL base** when the worker is reached through a gateway.
  </Accordion>

  <Accordion title="'worker_url_base must be an absolute URL'">
    **Worker URL base** needs both a scheme and a host, for example `https://gateway.example.com/MYTENANT/EPM_OLAP`. A bare path is rejected.
  </Accordion>

  <Accordion title="'ION API Gateway token exchange failed'">
    The client-credentials grant against `gateway_token_url` was refused. Re-copy `pu` + `ot`, `ci`, and `cs` from the backend-service `.ionapi` file, and add `gateway_scope` if the authorized application requires scopes.
  </Accordion>

  <Accordion title="Connected, but 0 catalogs found">
    Reported as *"No OLAP databases visible to this user — check application access."* The endpoint and credentials are fine; the EPM user has no access to any OLAP database.
  </Accordion>
</AccordionGroup>
