function load() {
					var oData;

					if (that.bDestroyed) {
						throw new Error("Meta model already destroyed");
					}
					oData = JSON.parse(JSON.stringify(oMetadata.getServiceMetadata()));
					that.oModel = new JSONModel(oData);
					that.oModel.setDefaultBindingMode(that.sDefaultBindingMode);
					/** @deprecated As of version 1.48.0, reason sap.ui.model.odata.ODataModel */
					if (!oDataModel._requestAnnotationChanges) {
						Utils.merge(oAnnotations ? oAnnotations.getData() : {}, oData, that,
							oDataModel.bIgnoreAnnotationsFromMetadata);
						return undefined;
					}
					return oDataModel._requestAnnotationChanges().then((aAnnotationChanges) => {
						Utils.merge(oAnnotations ? oAnnotations.getData() : {}, oData, that,
							oDataModel.bIgnoreAnnotationsFromMetadata);
						that.aAnnotationChanges = _Helper.deepClone(aAnnotationChanges, 20);
						that._applyAnnotationChanges();
					});
				}
DO NOT CALL this private constructor for a new <code>ODataMetaModel</code>,
but rather use {@link sap.ui.model.odata.v2.ODataModel#getMetaModel getMetaModel} instead!

@param {sap.ui.model.odata.ODataMetadata} oMetadata
  the OData model's metadata object
@param {sap.ui.model.odata.ODataAnnotations} [oAnnotations]
  the OData model's annotations object
@param {sap.ui.model.odata.v2.ODataModel} oDataModel
  the data model instance

@class Implementation of an OData meta model which offers a unified access to both OData V2
metadata and V4 annotations. It uses the existing {@link sap.ui.model.odata.ODataMetadata}
as a foundation and merges V4 annotations from the existing
{@link sap.ui.model.odata.ODataAnnotations} directly into the corresponding model element.

This model is not prepared to be inherited from.

Also, annotations from the "http://www.sap.com/Protocols/SAPData" namespace are lifted up
from the <code>extensions</code> array and transformed from objects into simple properties
with an "sap:" prefix for their name. Note that this happens in addition, thus the
following example shows both representations. This way, such annotations can be addressed
via a simple relative path instead of searching an array.
<pre>
		{
			"name" : "BusinessPartnerID",
			"extensions" : [{
				"name" : "label",
				"value" : "Bus. Part. ID",
				"namespace" : "http://www.sap.com/Protocols/SAPData"
			}],
			"sap:label" : "Bus. Part. ID"
		}
</pre>

As of 1.29.0, the corresponding vocabulary-based annotations for the following
"<a href="http://www.sap.com/Protocols/SAPData">SAP Annotations for OData Version 2.0</a>"
are added, if they are not yet defined in the V4 annotations:
<ul>
<li><code>label</code>;</li>
<li><code>schema-version</code> (since 1.53.0) on schemas;</li>
<li><code>creatable</code>, <code>deletable</code>, <code>deletable-path</code>,
<code>pageable</code>, <code>requires-filter</code>, <code>searchable</code>,
<code>topable</code>, <code>updatable</code> and <code>updatable-path</code> on entity sets;
</li>
<li><code>creatable</code> (since 1.41.0), <code>creatable-path</code> (since 1.41.0) and
<code>filterable</code> (since 1.39.0) on navigation properties;</li>
<li><code>aggregation-role</code> ("dimension" and "measure", both since 1.45.0),
<code>creatable</code>, <code>display-format</code> ("UpperCase" and "NonNegative"),
<code>field-control</code>, <code>filterable</code>, <code>filter-restriction</code>,
<code>heading</code>, <code>precision</code>, <code>quickinfo</code>,
<code>required-in-filter</code>, <code>sortable</code>, <code>text</code>, <code>unit</code>,
<code>updatable</code> and <code>visible</code> on properties;</li>
<li><code>semantics</code>; the following values are supported:
<ul>
<li>"bday", "city", "country", "email" (including support for types, for example
"email;type=home,pref"), "familyname", "givenname", "honorific", "middlename", "name",
"nickname", "note", "org", "org-unit", "org-role", "photo", "pobox", "region", "street",
"suffix", "tel" (including support for types, for example "tel;type=cell,pref"), "title" and
"zip" (mapped to V4 annotation <code>com.sap.vocabularies.Communication.v1.Contact</code>);
</li>
<li>"class", "dtend", "dtstart", "duration", "fbtype", "location", "status", "transp" and
"wholeday" (mapped to V4 annotation
<code>com.sap.vocabularies.Communication.v1.Event</code>);</li>
<li>"body", "from", "received", "sender" and "subject" (mapped to V4 annotation
<code>com.sap.vocabularies.Communication.v1.Message</code>);</li>
<li>"completed", "due", "percent-complete" and "priority" (mapped to V4 annotation
<code>com.sap.vocabularies.Communication.v1.Task</code>);</li>
<li>"fiscalyear", "fiscalyearperiod" (mapped to the corresponding V4 annotation
<code>com.sap.vocabularies.Common.v1.IsFiscal(Year|YearPeriod)</code>);</li>
<li>"year", "yearmonth", "yearmonthday", "yearquarter", "yearweek" (mapped to the
corresponding V4 annotation
<code>com.sap.vocabularies.Common.v1.IsCalendar(Year|YearMonth|Date|YearQuarter|YearWeek)</code>);
</li>
<li>"url" (mapped to V4 annotation <code>Org.OData.Core.V1.IsURL"</code>).</li>
</ul>
</ul>
For example:
<pre>
		{
			"name" : "BusinessPartnerID",
			...
			"sap:label" : "Bus. Part. ID",
			"com.sap.vocabularies.Common.v1.Label" : {
				"String" : "Bus. Part. ID"
			}
		}
</pre>
<b>Note:</b> Annotation terms are not merged, but replaced as a whole ("PUT" semantics). That
means, if you have, for example, an OData V2 annotation <code>sap:sortable=false</code> at a
property <code>PropA</code>, the corresponding OData V4 annotation is added to each entity
set to which this property belongs:
<pre>
		"Org.OData.Capabilities.V1.SortRestrictions": {
			"NonSortableProperties" : [
				{"PropertyPath" : "BusinessPartnerID"}
			]
		}
</pre>
If the same term <code>"Org.OData.Capabilities.V1.SortRestrictions"</code> targeting one of
these entity sets is also contained in an annotation file, the complete OData V4 annotation
converted from the OData V2 annotation is replaced by the one contained in the annotation
file for the specified target. Converted annotations never use a qualifier and are only
overwritten by the same annotation term without a qualifier.

This model is read-only and thus only supports
{@link sap.ui.model.BindingMode.OneTime OneTime} binding mode. No events
({@link sap.ui.model.Model#event:parseError parseError},
{@link sap.ui.model.Model#event:requestCompleted requestCompleted},
{@link sap.ui.model.Model#event:requestFailed requestFailed},
{@link sap.ui.model.Model#event:requestSent requestSent}) are fired!

Within the meta model, the objects are arranged in arrays.
<code>/dataServices/schema</code>, for example, is an array of schemas where each schema has
an <code>entityType</code> property with an array of entity types, and so on. So,
<code>/dataServices/schema/0/entityType/16</code> can be the path to the entity type with
name "Order" in the schema with namespace "MySchema". However, these paths are not stable:
If an entity type with lower index is removed from the schema, the path to
<code>Order</code> changes to <code>/dataServices/schema/0/entityType/15</code>.

To avoid problems with changing indexes, {@link sap.ui.model.Model#getObject getObject} and
{@link sap.ui.model.Model#getProperty getProperty} support XPath-like queries for the
indexes (since 1.29.1). Each index can be replaced by a query in square brackets. You can,
for example, address the schema using the path
<code>/dataServices/schema/[${namespace}==='MySchema']</code> or the entity using
<code>/dataServices/schema/[${namespace}==='MySchema']/entityType/[${name}==='Order']</code>.

The syntax inside the square brackets is the same as in expression binding. The query is
executed for each object in the array until the result is true (truthy) for the first time.
This object is then chosen.

<b>BEWARE:</b> Access to this OData meta model will fail before the promise returned by
{@link #loaded loaded} has been resolved!

@author SAP SE
@version ${version}
@alias sap.ui.model.odata.ODataMetaModel
@extends sap.ui.model.MetaModel
@public
@since 1.27.0