function addOrUpdateHierarchy(oColumn) {
			var iLevel = oColumn.level,
				sName = oColumn.name;

			aHierarchyProperties = aHierarchyProperties
				|| oEntityType.getAllHierarchyPropertyNames();

			aHierarchyProperties.forEach(function (sHierarchyName) {
				var oHierarchy = that.oAnalyticalQueryResult
						.findDimensionByPropertyName(sHierarchyName).getHierarchy(),
					oHierarchyDetails = null,
					// each hierarchy has a node ID property, see post processing in
					// sap.ui.model.analytics.odata4analytics.EntityType.prototype._init
					sNodeIDName = oHierarchy.getNodeIDProperty().name,
					oProperty;

				if (sNodeIDName === sName) {
					oHierarchyDetails = getOrCreateHierarchyDetails(oHierarchy);
				} else {
					oProperty = oHierarchy.getNodeExternalKeyProperty();
					if (oProperty && oProperty.name === sName) {
						oHierarchyDetails = getOrCreateHierarchyDetails(oHierarchy);
						oHierarchyDetails.nodeExternalKeyName = sName;
					} else {
						oProperty = oEntityType.getTextPropertyOfProperty(sNodeIDName);
						if (oProperty && oProperty.name === sName) {
							oHierarchyDetails = getOrCreateHierarchyDetails(oHierarchy);
							oHierarchyDetails.nodeTextName = sName;
						}
					}
				}
				if (oHierarchyDetails && "level" in oColumn) {
					// add level restriction and check that aColumns is properly defined
					if (typeof iLevel === "number") {
						if ("level" in oHierarchyDetails && oHierarchyDetails.level !== iLevel) {
							throw new Error("Multiple different level filter for hierarchy '"
								+ sNodeIDName + "' defined");
						}
						oHierarchyDetails.level = iLevel;
						// the property which defines the level also defines the grouping
						oHierarchyDetails.grouped = !!oColumn.grouped;
					} else {
						throw new Error("The level of '" + sNodeIDName
							+ "' has to be an integer value");
					}
				}
			});
		}
Updates the binding's structure with new analytical information.

Analytical information is the mapping of UI columns to properties in the bound OData entity
set. Every column object contains the <code>name</code> of the bound property and in
addition:
<ol>
  <li>A column bound to a dimension property has further boolean properties:
    <ul>
      <li>grouped: dimension is used for building groups</li>
      <li>inResult: if the column is not visible, but declared to be part of the result,
        values for the related property are also fetched from the OData service</li>
      <li>visible: if the column is visible, values for the related property are fetched from
        the OData service</li>
    </ul>
  </li>
  <li>A column bound to a measure property has further boolean properties:
    <ul>
      <li>inResult: if the column is not visible, but declared to be part of the result,
        values for the related property are also fetched from the OData service</li>
      <li>total: totals and sub-totals are provided for the measure at all aggregation
        levels</li>
      <li>visible: if the column is visible, values for the related property are fetched from
        the OData service</li>
    </ul>
  </li>
  <li>A column bound to a hierarchy property has further properties:
    <ul>
      <li>grouped: boolean value; indicates whether the hierarchy is used for building
          groups</li>
      <li>level: integer value; the hierarchy level is mandatory for at least one of those
          columns that represent the same hierarchy</li>
    </ul>
  </li>
</ol>

Invoking this function resets the state of the binding and subsequent data requests such as
calls to getNodeContexts() trigger OData requests in order to fetch the data that are in line
with this analytical information.

Be aware that a call of this function might lead to additional back-end requests, as well as
a control re-rendering later on.
Whenever possible use the API of the analytical control, instead of relying on the binding.

@function
@name sap.ui.model.analytics.AnalyticalBinding.prototype.updateAnalyticalInfo
@param {object[]} aColumns
  An array with objects holding the analytical information for every column
@param {boolean} bForceChange
  Whether to fire a change event asynchronously even if columns didn't change
@protected