diff --git a/docs/odata-csdl-json/odata-csdl-json.html b/docs/odata-csdl-json/odata-csdl-json.html index 20005b9f..f5ea66c0 100644 --- a/docs/odata-csdl-json/odata-csdl-json.html +++ b/docs/odata-csdl-json/odata-csdl-json.html @@ -1962,7 +1962,7 @@

action import.

-

Unbound functions are invoked as static functions within a common expression (see OData-URL, section “Common Expression Syntax”), or from the entity container through a function import.

+

Unbound functions are invoked as static functions within a common expression (see OData-URL, section 5.1.1), or from the entity container through a function import.

$IsBound

The value of $IsBound is one of the Boolean literals true or false. Absence of the member means false.

@@ -3539,7 +3539,7 @@

14.4.4.3 Function odata.matchesPattern

-

The odata.matchesPattern client-side function takes two string expressions as arguments and returns a Boolean value. It is the counterpart of the identically named URL function OData-URL, section “matchespattern.

+

The odata.matchesPattern client-side function takes two string expressions as arguments and returns a Boolean value. It is the counterpart of the identically named URL function OData-URL, section 5.1.1.7.1.

The function returns true if the second expression evaluates to an ECMAScript (JavaScript) regular expression and the result of the first argument expression matches that regular expression, using syntax and semantics of ECMAScript regular expressions.

Example 79: all non-empty FirstName values not containing the letters b, c, or d evaluate to true

diff --git a/docs/odata-csdl-json/odata-csdl-json.md b/docs/odata-csdl-json/odata-csdl-json.md index 8ca0e12c..17096bae 100644 --- a/docs/odata-csdl-json/odata-csdl-json.md +++ b/docs/odata-csdl-json/odata-csdl-json.md @@ -2798,7 +2798,7 @@ Unbound actions are invoked from the entity container through an [action import](#ActionImport). Unbound functions are invoked as static functions within a common expression -(see [OData-URL, section "Common Expression Syntax"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax)), +(see [OData-URL, section 5.1.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax)), or from the entity container through a [function import](#FunctionImport). ::: {.varjson .rep} @@ -5146,7 +5146,7 @@ Name property of the Actor entity The `odata.matchesPattern` client-side function takes two string expressions as arguments and returns a Boolean value. -It is the counterpart of the identically named URL function [OData-URL, section "`matchespattern`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#matchespattern). +It is the counterpart of the identically named URL function [OData-URL, section 5.1.1.7.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#matchespattern). The function returns true if the second expression evaluates to an [ECMAScript](#_ECMAScript) (JavaScript) regular expression and diff --git a/docs/odata-csdl-xml/odata-csdl-xml.html b/docs/odata-csdl-xml/odata-csdl-xml.html index 323d43d4..da7033c6 100644 --- a/docs/odata-csdl-xml/odata-csdl-xml.html +++ b/docs/odata-csdl-xml/odata-csdl-xml.html @@ -1849,7 +1849,7 @@

action import.

-

Unbound functions are invoked as static functions within a common expression (see OData-URL, section “Common Expression Syntax”), or from the entity container through a function import.

+

Unbound functions are invoked as static functions within a common expression (see OData-URL, section 5.1.1), or from the entity container through a function import.

Attribute IsBound

The value of IsBound is one of the Boolean literals true or false. Absence of the attribute means false.

@@ -3322,7 +3322,7 @@

14.4.4.3 Function odata.matchesPattern

-

The odata.matchesPattern client-side function takes two string expressions as arguments and returns a Boolean value. It is the counterpart of the identically named URL function OData-URL, section “matchespattern.

+

The odata.matchesPattern client-side function takes two string expressions as arguments and returns a Boolean value. It is the counterpart of the identically named URL function OData-URL, section 5.1.1.7.1.

The function returns true if the second expression evaluates to an ECMAScript (JavaScript) regular expression and the result of the first argument expression matches that regular expression, using syntax and semantics of ECMAScript regular expressions.

Example 79: all non-empty FirstName values not containing the letters b, c, or d evaluate to true

diff --git a/docs/odata-csdl-xml/odata-csdl-xml.md b/docs/odata-csdl-xml/odata-csdl-xml.md index 0406397e..fcca80a1 100644 --- a/docs/odata-csdl-xml/odata-csdl-xml.md +++ b/docs/odata-csdl-xml/odata-csdl-xml.md @@ -2677,7 +2677,7 @@ Unbound actions are invoked from the entity container through an [action import](#ActionImport). Unbound functions are invoked as static functions within a common expression -(see [OData-URL, section "Common Expression Syntax"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax)), +(see [OData-URL, section 5.1.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax)), or from the entity container through a [function import](#FunctionImport). @@ -4968,7 +4968,7 @@ Name property of the Actor entity The `odata.matchesPattern` client-side function takes two string expressions as arguments and returns a Boolean value. -It is the counterpart of the identically named URL function [OData-URL, section "`matchespattern`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#matchespattern). +It is the counterpart of the identically named URL function [OData-URL, section 5.1.1.7.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#matchespattern). The function returns true if the second expression evaluates to an [ECMAScript](#_ECMAScript) (JavaScript) regular expression and diff --git a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html index eb2103a4..bf4590bc 100644 --- a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html +++ b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.html @@ -1601,7 +1601,7 @@

OData-Protocol, section “System Query Options”. Stability across requests for system query options $top and $skip OData-Protocol, sections “System Query Option $top” and “System Query Option $skip is defined in section 3.3.7.

+

The system query option $apply is evaluated first, then the other system query options are evaluated, if applicable, on the result of $apply, see OData-Protocol, section 11.2.1. Stability across requests for system query options $top and $skip OData-Protocol, section 11.2.6.3 is defined in section 3.3.7.

Each set transformation:

  • carries over the input type to the output set such that it fits into the data model of the service.
  • @@ -1622,13 +1622,13 @@

    3.1.1 Type, Structure and Context URL

    -

    All input sets and output sets in one transformation sequence are collections of the input type, that is the entity type or complex type of the first input set, or in other words, of the resource to which the transformation sequence is applied. The input type is determined by the entity model element identified within the metadata document by the context URL of that resource OData-Protocol, section “Context URL”. Individual instances in an input or output set can have a subtype of the input type. (See example 74.) The transformation sequence given as the $apply system query option is applied to the resource addressed by the resource path. The transformations defined below can have nested transformation sequences as parameters, these are then applied to resources that can differ from the current input set.

    +

    All input sets and output sets in one transformation sequence are collections of the input type, that is the entity type or complex type of the first input set, or in other words, of the resource to which the transformation sequence is applied. The input type is determined by the entity model element identified within the metadata document by the context URL of that resource OData-Protocol, section 10. Individual instances in an input or output set can have a subtype of the input type. (See example 74.) The transformation sequence given as the $apply system query option is applied to the resource addressed by the resource path. The transformations defined below can have nested transformation sequences as parameters, these are then applied to resources that can differ from the current input set.

    The structure of an instance that occurs in an input or output set is defined by the names of the structural and navigation properties that the instance contains. Instances of an input type can have different structures, subject to the following rules:

    • Declared properties of the input type or a nested or related type thereof or of a subtype of one of these MUST have their declared type and meaning when they occur in an input or output set.
    • Single- or collection-valued primitive properties addressed by a property path starting at a non-transient entity MUST keep their values from the addressed resource path collection throughout the transformation sequence. Likewise, single- or collection-valued navigation property paths starting at a non-transient entity MUST keep addressing the same non-transient entities as in the addressed resource path collection.
    • Instances in an output set need not have all declared or dynamic properties that occurred in the input set.
    • -
    • Instances in an output set can have dynamic properties that did not occur in the input set. The name for such a dynamic property is called an alias, it is a simple identifier (see OData-CSDL, section “Simple Identifier”). Aliases MUST differ from names of declared properties in the input type, from names of properties in the first input set, and from names of properties in the current input set. Aliases in one collection MUST also differ from each other.
    • +
    • Instances in an output set can have dynamic properties that did not occur in the input set. The name for such a dynamic property is called an alias, it is a simple identifier (see OData-CSDL, section 15.2). Aliases MUST differ from names of declared properties in the input type, from names of properties in the first input set, and from names of properties in the current input set. Aliases in one collection MUST also differ from each other.

    Here is an overview of the structural changes made by different transformations:

      @@ -1638,14 +1638,14 @@

      During join, one instance with a collection of related instances is replaced by many copies, each of which is related via a dynamic property to one of the related instances.
    • During concatenation, the same instances are transformed multiple times and the output sets with their potentially different structures are concatenated.
    -

    An output set thus consists of instances with different structures. This is the same situation as with a collection of an open type (OData-CSDL, section “Open Entity Type” and OData-CSDL, section “Open Complex Type”) and it is handled in the same way.

    -

    If the first input set is a collection of entities from a given entity set, then so are all input sets and output sets in the transformation sequence. The {select-list} in the context URL OData-Protocol, section “Context URL” MUST describe only properties that are present or annotated as absent (for example, if Core.Permissions is None OData-Protocol, section “Requesting Individual Entities”) in all instances of the collection, after applying any $select and $expand system query options. The {select-list} SHOULD describe as many such properties as possible, even if the request involves a concatenation that leads to a non-homogeneous structure. If the server cannot determine any such properties, the {select-list} MUST consist of just the instance annotation AnyStructure defined in the Core vocabulary. (See example 75.)

    +

    An output set thus consists of instances with different structures. This is the same situation as with a collection of an open type (OData-CSDL, section 6.3 and OData-CSDL, section 9.3) and it is handled in the same way.

    +

    If the first input set is a collection of entities from a given entity set, then so are all input sets and output sets in the transformation sequence. The {select-list} in the context URL OData-Protocol, section 10 MUST describe only properties that are present or annotated as absent (for example, if Core.Permissions is None OData-Protocol, section 11.2.2) in all instances of the collection, after applying any $select and $expand system query options. The {select-list} SHOULD describe as many such properties as possible, even if the request involves a concatenation that leads to a non-homogeneous structure. If the server cannot determine any such properties, the {select-list} MUST consist of just the instance annotation AnyStructure defined in the Core vocabulary. (See example 75.)

    3.1.2 Sameness and Order

    Input sets and output sets are not sets of instances in the mathematical sense but collections, because the same instance can occur multiple times in them. In other words: A collection contains values (which can be instances of structured types or primitive values), possibly with repetitions. The occurrences of the values in the collection form a set in the mathematical sense. The cardinality of a collection is the total number of occurrences in it. When this text describes a transformation algorithmically and stipulates that certain steps are carried out for each occurrence in a collection, this means that the steps are carried out multiple times for the same value if it occurs multiple times in the collection.

    -

    A collection addressed by the resource path is returned by the service either as an ordered collection OData-Protocol, section “Managing Members of an Ordered Collection” or as an unordered collection. The same applies to collections that are nested in or related to the addressed resource as well as to collections that are the result of evaluating an expression starting with $root, which occur, for example, as the first parameter of a hierarchical transformation.

    +

    A collection addressed by the resource path is returned by the service either as an ordered collection OData-Protocol, section 11.4.10 or as an unordered collection. The same applies to collections that are nested in or related to the addressed resource as well as to collections that are the result of evaluating an expression starting with $root, which occur, for example, as the first parameter of a hierarchical transformation.

    But when such a collection is transformed by the $apply system query option, additional cases can arise that are neither ordered nor totally unordered. For example, the groupby transformation retains any order within a group but not between groups.

    ⚠ Example 6: Request the top 10 sales per customer. The processing of the request can be parallelized per customer and the responses per customer can be interleaved in the overall response. This means that for any given customer, their top 10 sales appear in the desired order, though not consecutively.

    @@ -1656,15 +1656,15 @@

    \(u_1\) is processed before \(u_2\) whenever \(u_1\) precedes \(u_2\). Likewise, in an order-preserving sequence \(u_1,…,u_n\) we have \(i<j\) whenever \(u_i\) precedes \(u_j\).

    A collection can be stable-sorted by a list of expressions. In the stable-sorted collection an occurrence \(u_1\) precedes \(u_2\) if and only if either

    Stable-sorting of an ordered collection produces another ordered collection. A stable-sort does not necessarily produce a total order, the sorted collection may still contain two occurrences whose relative order does not matter. The transformation orderby performs a stable-sort.

    -

    The output set of a basic aggregation transformation can contain instances of an entity type without entity-id. After a concat transformation, different occurrences of the same entity can differ in individual non-declared properties. To account for such cases, the definition of sameness given in OData-URL, section “Equals” is refined here. Instances of structured types are the same if

    +

    The output set of a basic aggregation transformation can contain instances of an entity type without entity-id. After a concat transformation, different occurrences of the same entity can differ in individual non-declared properties. To account for such cases, the definition of sameness given in OData-URL, section 5.1.1.1.1 is refined here. Instances of structured types are the same if

    • both are instances of complex types and both are null or both have the same structure and same values with null considered different from absent or
    • -
    • both are instances of entity types without entity-id (see OData-Protocol, section “Transient Entities”) and both are null or both have the same structure and same values with null considered different from absent (informally speaking, they are compared like complex instances) or
    • -
    • (1) both are instances of the same entity type with the same entity-id (non-transient entities, see OData-Protocol, section “Entity-Ids and Entity References”) and (2) the structural and navigation properties contained in both have the same values (for non-primitive properties the sameness of values is decided by a recursive invocation of this definition). +
    • both are instances of entity types without entity-id (see OData-Protocol, section 4.3) and both are null or both have the same structure and same values with null considered different from absent (informally speaking, they are compared like complex instances) or
    • +
    • (1) both are instances of the same entity type with the same entity-id (non-transient entities, see OData-Protocol, section 4.1) and (2) the structural and navigation properties contained in both have the same values (for non-primitive properties the sameness of values is decided by a recursive invocation of this definition).
      • If this is fulfilled, the instances are called complementary representations of the same non-transient entity. If this case is encountered at some recursion level while the sameness of non-transient entities \(u_1\) and \(u_2\) is established, a merged representation of the entity \(u_1=u_2\) exists that contains all properties of \(u_1\) and \(u_2\). But if the instances both occur in the last output set, services MUST represent each with its own structure in the response payload.
      • If the first condition is fulfilled but not the second, the instances are not the same and are called contradictory representations of the same non-transient entity. (Example 103 describes a use case for this.)
      • @@ -1680,13 +1680,13 @@

        3.1.3 Evaluation of Data Aggregation Paths

        This document specifies how a data aggregation path that occurs in a request is evaluated by the service. If such an evaluation fails, the service MUST reject the request.

        -

        For a data aggregation path to be a common expression according to OData-URL, section “Common Expression Syntax”, its segments must be single-valued with the possible exception of the last segment, and it can then be evaluated relative to an instance of a structured type. For the transformations defined in this document, a data aggregation path can also be evaluated relative to a collection \(A\), even if it has arbitrary collection-valued segments itself.

        +

        For a data aggregation path to be a common expression according to OData-URL, section 5.1.1, its segments must be single-valued with the possible exception of the last segment, and it can then be evaluated relative to an instance of a structured type. For the transformations defined in this document, a data aggregation path can also be evaluated relative to a collection \(A\), even if it has arbitrary collection-valued segments itself.

        To this end, the following notation is used in the subsequent sections: If \(A\) is a collection and \(p\) a data aggregation path, optionally followed by a type-cast segment, the result of such a path evaluation is denoted by \(\Gamma(A,p)\) and defined as the unordered concatenation, possibly containing repetitions, of the collections \(γ(u,p)\) for each \(u\) in \(A\) that is not null. The function \(γ(u,p)\) takes a non-null value and a path as arguments and returns a collection of instances of structured types or primitive values, depending on the type of the final segment of \(p\). It is recursively defined as follows:

        1. If \(p\) is an empty path, let \(B\) be a collection with \(u\) as its single member and continue with step 9.
        2. Let \(p_1\) be the first segment of \(p\) and \(p_2\) the remainder, if any, such that \(p\) equals the concatenated path \(p_1/p_2\).
        3. If \(p_1\) is a type-cast segment and \(u\) is of its type or a subtype thereof, let \(v=u\) and continue with step 8.
        4. -
        5. If \(p_1\) is a type-cast segment and \(u\) is not of its type or a subtype thereof, let \(B\) be an empty collection and continue with step 9. (This rule follows OData-URL, section “Addressing Derived Types” rather than OData-CSDL, section “Path Syntax”.)
        6. +
        7. If \(p_1\) is a type-cast segment and \(u\) is not of its type or a subtype thereof, let \(B\) be an empty collection and continue with step 9. (This rule follows OData-URL, section 4.11 rather than OData-CSDL, section 14.4.1.1.)
        8. Otherwise, \(p_1\) is a non-type-cast segment. If \(u\) does not contain a structural or navigation property \(p_1\), let \(B\) be an empty collection and continue with step 9.
        9. If \(p_1\) is single-valued, let \(v\) be the value of the structural or navigation property \(p_1\) in \(u\). If \(v\) is null, let \(B\) be an empty collection and continue with step 9; otherwise continue with step 8.
        10. Otherwise, \(p_1\) is collection-valued. Let \(C\) be the collection addressed by the structural or navigation property \(p_1\) in \(u\), and let \(B=\Gamma(C,p_2)\). Then continue with step 9.
        11. @@ -1837,7 +1837,7 @@
          3.2.1.3.5 Standard Aggregation Method countdistinct
          -

          The aggregation method countdistinct can be applied to arbitrary collections to count the distinct values. Instance comparison uses the definition of equality in OData-URL, section “Equals”.

          +

          The aggregation method countdistinct can be applied to arbitrary collections to count the distinct values. Instance comparison uses the definition of equality in OData-URL, section 5.1.1.1.1.

          The result property MUST have type Edm.Decimal with Scale 0 and sufficient Precision.

          Example 13:

          @@ -2342,7 +2342,7 @@

          3.3.7 Stable Total Order Before $skip and $top

          -

          When the system query options $top and $skip OData-Protocol, sections “System Query Option $top” and “System Query Option $skip are executed after the system query option $apply and after $filter and $orderby, if applicable, they operate on a collection with a total order that extends any existing order but is otherwise chosen by the service. The total order MUST be stable across requests.

          +

          When the system query options $top and $skip OData-Protocol, section 11.2.6.3 are executed after the system query option $apply and after $filter and $orderby, if applicable, they operate on a collection with a total order that extends any existing order but is otherwise chosen by the service. The total order MUST be stable across requests.

    @@ -2363,7 +2363,7 @@

    alias.

    -

    The output set is constructed by copying the instances of the input set and adding one dynamic property per compute expression to each occurrence in the output set. The name of each added dynamic property is the alias of the corresponding compute expression. The value of each added dynamic property is computed relative to the corresponding instance. Services MAY support expressions that address dynamic properties added by other expressions within the same compute transformation, provided that the service can determine an evaluation sequence. The type of the property is determined by the rules for evaluating common expressions and numeric promotion defined in OData-URL, section “Common Expression Syntax”.

    +

    The output set is constructed by copying the instances of the input set and adding one dynamic property per compute expression to each occurrence in the output set. The name of each added dynamic property is the alias of the corresponding compute expression. The value of each added dynamic property is computed relative to the corresponding instance. Services MAY support expressions that address dynamic properties added by other expressions within the same compute transformation, provided that the service can determine an evaluation sequence. The type of the property is determined by the rules for evaluating common expressions and numeric promotion defined in OData-URL, section 5.1.1.

    Example 37:

    GET /service/Sales?$apply=compute(Amount mul Product/TaxRate as Tax)
    @@ -2387,7 +2387,7 @@

    3.4.3 Transformation addnested

    The addnested transformation expands a path relative to the input set, applies one or more transformation sequences to the addressed resources, and adds the transformed resources as dynamic (navigation) properties to the output set. The output set \(A\) is initially a clone of the input set.

    -

    The first parameter of the addnested transformation is a path \(p\) or a concatenated path \(p/q\). Here, \(p=p_1/…/p_k\) with \(k≥1\) is a data aggregation path with single- or collection-valued segments. The path \(p\) MUST NOT contain any navigation properties prior to the last segment \(p_k\), which MUST either be a navigation or a complex structural property. If the optional \(q\) is present, it MUST be a type-cast segment. This is an extension of the definition in OData-URL, section “System Query Option $expand in that the first parameter need not contain a navigation property.

    +

    The first parameter of the addnested transformation is a path \(p\) or a concatenated path \(p/q\). Here, \(p=p_1/…/p_k\) with \(k≥1\) is a data aggregation path with single- or collection-valued segments. The path \(p\) MUST NOT contain any navigation properties prior to the last segment \(p_k\), which MUST either be a navigation or a complex structural property. If the optional \(q\) is present, it MUST be a type-cast segment. This is an extension of the definition in OData-URL, section 5.1.3 in that the first parameter need not contain a navigation property.

    Further parameters are one or more transformation sequences followed by the as keyword followed by an alias whose name need not differ from names in the input set but MUST differ from names already in \(\Gamma(A,p_1/…/p_{k-1})\) (using the \(\Gamma\) notation) as well as from aliases for other transformation sequences.

    If \(p_k\) is single-valued, the transformation sequences MUST consist of only identity or compute or addnested transformations, because these transform one-element collections into one-element collections. This makes it meaningful to speak (in this section only) of a transformation sequence applied to a single instance; this means applying it to a collection containing the single instance and taking as result the single instance from the output set.

    For each occurrence \(u\) in \(\Gamma(A,p_1/…/p_{k-1})\), let \(B=γ(u,p_k/q)\) and let the resource \(v\) be

    @@ -2516,11 +2516,11 @@

    expression that are evaluated relative to a collection, called the input collection.

    These expressions are

      -
    • either prepended with a collection-valued path \(p\) followed by a forward slash, like a lambda operator OData-URL, section “Lambda Operators”. The collection identified by that path is then the input collection for the expression.
    • +
    • either prepended with a collection-valued path \(p\) followed by a forward slash, like a lambda operator OData-URL, section 5.1.1.13. The collection identified by that path is then the input collection for the expression.
    • or prepended with the keyword $these followed by a forward slash, the input collection is then the current collection defined as follows:
      • In a system query option other than $apply, possibly nested within $expand or $select, the current collection is the collection that is the subject of the system query option.
      • -
      • In a path segment that addresses a subset of a collection OData-URL, section “Addressing a Subset of a Collection”, the current collection is the collection that is the subject of the path segment.
      • +
      • In a path segment that addresses a subset of a collection OData-URL, section 4.12, the current collection is the collection that is the subject of the path segment.
      • In an $apply transformation, the current collection is the input set of the transformation.
    @@ -2574,13 +2574,13 @@

    3. ] }

-

A definition that is equivalent to a $count expression after a collection-valued path was made in OData-URL, section “Addressing the Count of a Collection”.

+

A definition that is equivalent to a $count expression after a collection-valued path was made in OData-URL, section 4.8.

3.7 Function isdefined

-

Properties that are not explicitly mentioned in aggregate or groupby are considered to have been aggregated away. Since they are treated as having the null value in $filter expressions OData-URL, section “Path Expressions”, the $filter expression Product eq null cannot distinguish between an instance containing the value for the null product and the instance containing the aggregated value across all products (where the Product has been aggregated away).

+

Properties that are not explicitly mentioned in aggregate or groupby are considered to have been aggregated away. Since they are treated as having the null value in $filter expressions OData-URL, section 5.1.1.15, the $filter expression Product eq null cannot distinguish between an instance containing the value for the null product and the instance containing the aggregated value across all products (where the Product has been aggregated away).

The function isdefined can be used to determine whether a property is present or absent in an instance. It takes a single-valued property path as its only parameter and returns true if the property is present in the instance for which the expression containing the isdefined function call is evaluated. A present property can still have the null value; it can represent a grouping of null values, or an aggregation that results in a null value.

Example 45: Product has been aggregated away, causing an empty result

@@ -4558,7 +4558,7 @@

-

Example 115: Move a sales organization Switzerland under the parent EMEA Central by binding the parent navigation property to EMEA Central OData-JSON, section “Bind Operation”:

+

Example 115: Move a sales organization Switzerland under the parent EMEA Central by binding the parent navigation property to EMEA Central OData-JSON, section 8.5:

PATCH /service/SalesOrganizations('Switzerland')
 Content-Type: application/json
 
@@ -4573,7 +4573,7 @@ 

-

Example 116: If the parent navigation property contained a referential constraint for the key of the target OData-CSDL, section “Referential Constraint”,

+

Example 116: If the parent navigation property contained a referential constraint for the key of the target OData-CSDL, section 8.5,

<EntityType Name="SalesOrganization">
   <Key>
     <PropertyRef Name="ID" />
@@ -4587,7 +4587,7 @@ 

ReferencedProperty="ID" /> </NavigationProperty> </EntityType>

-

then alternatively the property taking part in the referential constraint OData-Protocol, section “Update a Primitive Property” could be changed to EMEA Central:

+

then alternatively the property taking part in the referential constraint OData-Protocol, section 11.4.9.1 could be changed to EMEA Central:

PATCH /service/SalesOrganizations('Switzerland')
 Content-Type: application/json
 
diff --git a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md
index b0dbdf54..773993b5 100644
--- a/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md
+++ b/docs/odata-data-aggregation-ext/odata-data-aggregation-ext.md
@@ -1007,7 +1007,7 @@ A _set transformation_ (_transformation_ for short) is an operation on an input
 
 The system query option `$apply` MUST NOT be used if the resource path addresses a single instance.
 
-The system query option `$apply` is evaluated first, then the other system query options are evaluated, if applicable, on the result of `$apply`, see [OData-Protocol, section "System Query Options"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptions). Stability across requests for system query options `$top` and `$skip` [OData-Protocol, sections "System Query Option `$top`" and "System Query Option `$skip`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptiontop) is defined in [section 3.3.7](#StableTotalOrderBeforeskipandtop).
+The system query option `$apply` is evaluated first, then the other system query options are evaluated, if applicable, on the result of `$apply`, see [OData-Protocol, section 11.2.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptions). Stability across requests for system query options `$top` and `$skip` [OData-Protocol, section 11.2.6.3](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptiontop) is defined in [section 3.3.7](#StableTotalOrderBeforeskipandtop).
 
 Each set transformation:
 - carries over the input type to the output set such that it fits into the data model of the service.
@@ -1033,13 +1033,13 @@ The definitions of italicized terms made in this section are used throughout thi
 
 ### 3.1.1 Type, Structure and Context URL
 
-All input sets and output sets in one transformation sequence are collections of the _input type_, that is the entity type or complex type of the first input set, or in other words, of the resource to which the transformation sequence is applied. The input type is determined by the entity model element identified within the metadata document by the context URL of that resource [OData-Protocol, section "Context URL"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ContextURL). Individual instances in an input or output set can have a subtype of the input type. (See [example 74](#subinputtype).) The transformation sequence given as the `$apply` system query option is applied to the resource addressed by the resource path. The transformations defined below can have nested transformation sequences as parameters, these are then applied to resources that can differ from the current input set.
+All input sets and output sets in one transformation sequence are collections of the _input type_, that is the entity type or complex type of the first input set, or in other words, of the resource to which the transformation sequence is applied. The input type is determined by the entity model element identified within the metadata document by the context URL of that resource [OData-Protocol, section 10](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ContextURL). Individual instances in an input or output set can have a subtype of the input type. (See [example 74](#subinputtype).) The transformation sequence given as the `$apply` system query option is applied to the resource addressed by the resource path. The transformations defined below can have nested transformation sequences as parameters, these are then applied to resources that can differ from the current input set.
 
 The _structure_ of an instance that occurs in an input or output set is defined by the names of the structural and navigation properties that the instance contains. Instances of an input type can have different structures, subject to the following rules:
 - Declared properties of the input type or a nested or related type thereof or of a subtype of one of these MUST have their declared type and meaning when they occur in an input or output set.
 - Single- or collection-valued primitive properties addressed by a property path starting at a non-transient entity MUST keep their values from the addressed resource path collection throughout the transformation sequence. Likewise, single- or collection-valued navigation property paths starting at a non-transient entity MUST keep addressing the same non-transient entities as in the addressed resource path collection.
 - Instances in an output set need not have all declared or dynamic properties that occurred in the input set.
-- Instances in an output set can have dynamic properties that did not occur in the input set. The name for such a dynamic property is called an _alias_, it is a simple identifier (see [OData-CSDL, section "Simple Identifier"](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#SimpleIdentifier)). Aliases MUST differ from names of declared properties in the input type, from names of properties in the first input set, and from names of properties in the current input set. Aliases in one collection MUST also differ from each other.
+- Instances in an output set can have dynamic properties that did not occur in the input set. The name for such a dynamic property is called an _alias_, it is a simple identifier (see [OData-CSDL, section 15.2](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#SimpleIdentifier)). Aliases MUST differ from names of declared properties in the input type, from names of properties in the first input set, and from names of properties in the current input set. Aliases in one collection MUST also differ from each other.
 
 Here is an overview of the structural changes made by different transformations:
 - During [aggregation](#BasicAggregation) or [nest](#Transformationnest), many instances are replaced by one instance, properties that represent the aggregation level are retained, and others are replaced by dynamic properties holding the aggregate value of the many instances or a transformed copy of them.
@@ -1048,15 +1048,15 @@ Here is an overview of the structural changes made by different transformations:
 - During [join](#Transformationsjoinandouterjoin), one instance with a collection of related instances is replaced by many copies, each of which is related via a dynamic property to one of the related instances.
 - During [concatenation](#Transformationconcat), the same instances are transformed multiple times and the output sets with their potentially different structures are concatenated.
 
-An output set thus consists of instances with different structures. This is the same situation as with a collection of an open type ([OData-CSDL, section "Open Entity Type"](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#OpenEntityType) and [OData-CSDL, section "Open Complex Type"](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#OpenComplexType)) and it is handled in the same way.
+An output set thus consists of instances with different structures. This is the same situation as with a collection of an open type ([OData-CSDL, section 6.3](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#OpenEntityType) and [OData-CSDL, section 9.3](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#OpenComplexType)) and it is handled in the same way.
 
-If the first input set is a collection of entities from a given entity set, then so are all input sets and output sets in the transformation sequence. The `{select-list}` in the context URL [OData-Protocol, section "Context URL"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ContextURL) MUST describe only properties that are present or annotated as absent (for example, if `Core.Permissions` is `None` [OData-Protocol, section "Requesting Individual Entities"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#RequestingIndividualEntities)) in all instances of the collection, after applying any `$select` and `$expand` system query options. The `{select-list}` SHOULD describe as many such properties as possible, even if the request involves a concatenation that leads to a non-homogeneous structure. If the server cannot determine any such properties, the `{select-list}` MUST consist of just the instance annotation `AnyStructure` defined in the [`Core` vocabulary](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#AnyStructure). (See [example 75](#anystructure).)
+If the first input set is a collection of entities from a given entity set, then so are all input sets and output sets in the transformation sequence. The `{select-list}` in the context URL [OData-Protocol, section 10](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ContextURL) MUST describe only properties that are present or annotated as absent (for example, if `Core.Permissions` is `None` [OData-Protocol, section 11.2.2](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#RequestingIndividualEntities)) in all instances of the collection, after applying any `$select` and `$expand` system query options. The `{select-list}` SHOULD describe as many such properties as possible, even if the request involves a concatenation that leads to a non-homogeneous structure. If the server cannot determine any such properties, the `{select-list}` MUST consist of just the instance annotation `AnyStructure` defined in the [`Core` vocabulary](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#AnyStructure). (See [example 75](#anystructure).)
 
 ### 3.1.2 Sameness and Order
 
 Input sets and output sets are not sets of instances in the mathematical sense but collections, because the same instance can occur multiple times in them. In other words: A collection contains values (which can be instances of structured types or primitive values), possibly with repetitions. The occurrences of the values in the collection form a set in the mathematical sense. The _cardinality_ of a collection is the total number of occurrences in it. When this text describes a transformation algorithmically and stipulates that certain steps are carried out _for each occurrence_ in a collection, this means that the steps are carried out multiple times for the same value if it occurs multiple times in the collection.
 
-A collection addressed by the resource path is returned by the service either as an ordered collection [OData-Protocol, section "Managing Members of an Ordered Collection"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ManagingMembersofanOrderedCollection) or as an unordered collection. The same applies to collections that are nested in or related to the addressed resource as well as to collections that are the result of evaluating an expression starting with `$root`, which occur, for example, as the first parameter of a [hierarchical transformation](#HierarchicalTransformations).
+A collection addressed by the resource path is returned by the service either as an ordered collection [OData-Protocol, section 11.4.10](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ManagingMembersofanOrderedCollection) or as an unordered collection. The same applies to collections that are nested in or related to the addressed resource as well as to collections that are the result of evaluating an expression starting with `$root`, which occur, for example, as the first parameter of a [hierarchical transformation](#HierarchicalTransformations).
 
 But when such a collection is transformed by the `$apply` system query option, additional cases can arise that are neither ordered nor totally unordered. For example, the [`groupby`](#Transformationgroupby) transformation retains any order within a group but not between groups.
 
@@ -1074,15 +1074,15 @@ An order of a collection is more precisely defined as follows: Given two differe
 When transformations are defined in the following sections, the algorithmic description sometimes contains an _order-preserving loop_ over a collection. Such a loop processes the occurrences in an order chosen by the service in such a way that $u_1$ is processed before $u_2$ whenever $u_1$ precedes $u_2$. Likewise, in an _order-preserving sequence_ $u_1,…,u_n$ we have $i3.2.1.3.5 Standard Aggregation Method `countdistinct`
 
-The aggregation method `countdistinct` can be applied to arbitrary collections to count the distinct values. Instance comparison uses the definition of equality in [OData-URL, section "Equals"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#Equals).
+The aggregation method `countdistinct` can be applied to arbitrary collections to count the distinct values. Instance comparison uses the definition of equality in [OData-URL, section 5.1.1.1.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#Equals).
 
 The result property MUST have type `Edm.Decimal` with `Scale` 0 and sufficient `Precision`.
 
@@ -1904,7 +1904,7 @@ results in
 
 ### 3.3.7 Stable Total Order Before `$skip` and `$top`
 
-When the system query options `$top` and `$skip` [OData-Protocol, sections "System Query Option `$top`" and "System Query Option `$skip`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptiontop) are executed after the system query option `$apply` and after `$filter` and `$orderby`, if applicable, they operate on a collection with a total order that extends any existing order but is otherwise chosen by the service. The total order MUST be stable across requests.
+When the system query options `$top` and `$skip` [OData-Protocol, section 11.2.6.3](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptiontop) are executed after the system query option `$apply` and after `$filter` and `$orderby`, if applicable, they operate on a collection with a total order that extends any existing order but is otherwise chosen by the service. The total order MUST be stable across requests.
 
 ## 3.4 One-to-One Transformations
 
@@ -1927,7 +1927,7 @@ The `compute` transformation takes a comma-separated list of one or more _comput
 
 A compute expression is a common expression followed by the `as` keyword, followed by an [alias](#TypeStructureandContextURL).
 
-The output set is constructed by copying the instances of the input set and adding one dynamic property per compute expression to [each occurrence](#SamenessandOrder) in the output set. The name of each added dynamic property is the alias of the corresponding compute expression. The value of each added dynamic property is computed relative to the corresponding instance. Services MAY support expressions that address dynamic properties added by other expressions within the same `compute` transformation, provided that the service can determine an evaluation sequence. The type of the property is determined by the rules for evaluating common expressions and numeric promotion defined in [OData-URL, section "Common Expression Syntax"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax).
+The output set is constructed by copying the instances of the input set and adding one dynamic property per compute expression to [each occurrence](#SamenessandOrder) in the output set. The name of each added dynamic property is the alias of the corresponding compute expression. The value of each added dynamic property is computed relative to the corresponding instance. Services MAY support expressions that address dynamic properties added by other expressions within the same `compute` transformation, provided that the service can determine an evaluation sequence. The type of the property is determined by the rules for evaluating common expressions and numeric promotion defined in [OData-URL, section 5.1.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax).
 
 ::: example
 Example 37:
@@ -1956,7 +1956,7 @@ results in
 
 The `addnested` transformation expands a path relative to the input set, applies one or more transformation sequences to the addressed resources, and adds the transformed resources as dynamic (navigation) properties to the output set. The output set $A$ is initially a clone of the input set.
 
-The first parameter of the `addnested` transformation is a path $p$ or a concatenated path $p/q$. Here, $p=p_1/…/p_k$ with $k≥1$ is a [data aggregation path](#DataAggregationPath) with single- or collection-valued segments. The path $p$ MUST NOT contain any navigation properties prior to the last segment $p_k$, which MUST either be a navigation or a complex structural property. If the optional $q$ is present, it MUST be a type-cast segment. This is an extension of the definition in [OData-URL, section "System Query Option `$expand`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#SystemQueryOptionexpand) in that the first parameter need not contain a navigation property.
+The first parameter of the `addnested` transformation is a path $p$ or a concatenated path $p/q$. Here, $p=p_1/…/p_k$ with $k≥1$ is a [data aggregation path](#DataAggregationPath) with single- or collection-valued segments. The path $p$ MUST NOT contain any navigation properties prior to the last segment $p_k$, which MUST either be a navigation or a complex structural property. If the optional $q$ is present, it MUST be a type-cast segment. This is an extension of the definition in [OData-URL, section 5.1.3](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#SystemQueryOptionexpand) in that the first parameter need not contain a navigation property.
 
 Further parameters are one or more transformation sequences followed by the `as` keyword followed by an [alias](#TypeStructureandContextURL) whose name need not differ from names in the input set but MUST differ from names already in $\Gamma(A,p_1/…/p_{k-1})$ (using the [$\Gamma$ notation](#EvaluationofDataAggregationPaths)) as well as from aliases for other transformation sequences.
 
@@ -2098,10 +2098,10 @@ results in
 The following two subsections introduce two new types of [expression](#Expression) that are evaluated relative to a collection, called the input collection.
 
 These expressions are
-- either prepended with a collection-valued path $p$ followed by a forward slash, like a lambda operator [OData-URL, section "Lambda Operators"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#LambdaOperators). The collection identified by that path is then the input collection for the expression.
+- either prepended with a collection-valued path $p$ followed by a forward slash, like a lambda operator [OData-URL, section 5.1.1.13](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#LambdaOperators). The collection identified by that path is then the input collection for the expression.
 - or prepended with the keyword `$these` followed by a forward slash, the input collection is then the _current collection_ defined as follows:
   - In a system query option other than `$apply`, possibly nested within `$expand` or `$select`, the current collection is the collection that is the subject of the system query option.
-  - In a path segment that addresses a subset of a collection [OData-URL, section "Addressing a Subset of a Collection"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingaSubsetofaCollection), the current collection is the collection that is the subject of the path segment.
+  - In a path segment that addresses a subset of a collection [OData-URL, section 4.12](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingaSubsetofaCollection), the current collection is the collection that is the subject of the path segment.
   - In an `$apply` transformation, the current collection is the input set of the transformation.
 
 ### 3.6.1 Function `aggregate`
@@ -2172,11 +2172,11 @@ results in 2 (a third of 8, rounded down) entities. (This differs from `topperce
 ```
 :::
 
-A definition that is equivalent to a `$count` expression after a collection-valued path was made in [OData-URL, section "Addressing the Count of a Collection"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingtheCountofaCollection).
+A definition that is equivalent to a `$count` expression after a collection-valued path was made in [OData-URL, section 4.8](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingtheCountofaCollection).
 
 ## 3.7 Function `isdefined`
 
-Properties that are not explicitly mentioned in [`aggregate`](#Transformationaggregate) or [`groupby`](#Transformationgroupby) are considered to have been _aggregated away_. Since they are treated as having the null value in `$filter` expressions [OData-URL, section "Path Expressions"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#PathExpressions), the `$filter` expression `Product eq null` cannot distinguish between an instance containing the value for the null product and the instance containing the aggregated value across all products (where the `Product` has been aggregated away).
+Properties that are not explicitly mentioned in [`aggregate`](#Transformationaggregate) or [`groupby`](#Transformationgroupby) are considered to have been _aggregated away_. Since they are treated as having the null value in `$filter` expressions [OData-URL, section 5.1.1.15](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#PathExpressions), the `$filter` expression `Product eq null` cannot distinguish between an instance containing the value for the null product and the instance containing the aggregated value across all products (where the `Product` has been aggregated away).
 
 The function `isdefined` can be used to determine whether a property is present or absent in an instance. It takes a [single-valued property path](#SingleValuedPropertyPath) as its only parameter and returns true if the property is present in the instance for which the expression containing the `isdefined` function call is evaluated. A present property can still have the null value; it can represent a grouping of null values, or an aggregation that results in a null value.
 
@@ -4585,7 +4585,7 @@ works differently: `descendants` is the parameter $T$ of `ancestors` and operate
 Besides changes to the structural properties of the entities in a hierarchical collection, hierarchy maintenance involves changes to the parent-child relationships.
 
 ::: example
-Example 115: Move a sales organization Switzerland under the parent EMEA Central by binding the parent navigation property to EMEA Central [OData-JSON, section "Bind Operation"](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#BindOperation):
+Example 115: Move a sales organization Switzerland under the parent EMEA Central by binding the parent navigation property to EMEA Central [OData-JSON, section 8.5](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#BindOperation):
 ```json
 PATCH /service/SalesOrganizations('Switzerland')
 Content-Type: application/json
@@ -4608,7 +4608,7 @@ DELETE /service/SalesOrganizations('Switzerland')/Superordinate/$ref
 :::
 
 ::: example
-Example 116: If the parent navigation property contained a referential constraint for the key of the target [OData-CSDL, section "Referential Constraint"](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#ReferentialConstraint),
+Example 116: If the parent navigation property contained a referential constraint for the key of the target [OData-CSDL, section 8.5](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#ReferentialConstraint),
 ```xml
 
   
@@ -4624,7 +4624,7 @@ Example 116: If the parent navigation pr
   
 
 ```
-then alternatively the property taking part in the referential constraint [OData-Protocol, section "Update a Primitive Property"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#UpdateaPrimitiveProperty) could be changed to EMEA Central:
+then alternatively the property taking part in the referential constraint [OData-Protocol, section 11.4.9.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#UpdateaPrimitiveProperty) could be changed to EMEA Central:
 ```json
 PATCH /service/SalesOrganizations('Switzerland')
 Content-Type: application/json
diff --git a/docs/odata-json-format/odata-json-format.html b/docs/odata-json-format/odata-json-format.html
index a23264ec..2b89ccdb 100644
--- a/docs/odata-json-format/odata-json-format.html
+++ b/docs/odata-json-format/odata-json-format.html
@@ -717,7 +717,7 @@ 

4.6.4 Control Information: count (odata.count)

-

The count control information occurs only in responses and can annotate any collection, see OData-Protocol, section “System Query Option $count. Its value is an Edm.Int64 value corresponding to the total count of members in the collection represented by the request.

+

The count control information occurs only in responses and can annotate any collection, see OData-Protocol, section 11.2.6.5. Its value is an Edm.Int64 value corresponding to the total count of members in the collection represented by the request.

@@ -791,7 +791,7 @@ -

For media entities and stream properties at least one of the control information mediaEditLink and mediaReadLink MUST be included in responses if they don’t follow standard URL conventions as defined in OData-URL, section “Addressing a Property” and OData-URL, section “Addressing the Media Stream of a Media Entity”, or if metadata=full is requested.

+

For media entities and stream properties at least one of the control information mediaEditLink and mediaReadLink MUST be included in responses if they don’t follow standard URL conventions as defined in OData-URL, section 4.6 and OData-URL, section 4.14, or if metadata=full is requested.

The mediaEditLink control information contains a URL that can be used to update the binary stream associated with the media entity or stream property. It MUST be included for updatable streams if it differs from standard URL conventions relative to the edit link of the entity.

The mediaReadLink control information contains a URL that can be used to read the binary stream associated with the media entity or stream property. It MUST be included if its value differs from the value of the associated mediaEditLink, if present, or if it doesn’t follow standard URL conventions relative to the read link of the entity and the associated mediaEditLink is not present.

The mediaContentType control information MAY be included; its value SHOULD match the media type of the binary stream represented by the mediaReadLink URL. This is only a hint; the actual media type will be included in the Content-Type header when the resource is requested. The presence of mediaContentType with value null MAY be used to indicate the absence of a binary stream.

@@ -1374,7 +1374,7 @@

14

15 Delta Payload

-

The non-format specific aspects of the delta handling are described in OData-Protocol, section “Requesting Changes”.

+

The non-format specific aspects of the delta handling are described in OData-Protocol, section 11.3.

15.1 Delta Responses

@@ -2060,7 +2060,7 @@

"CustomerID": "ALFKI" } -

Alternatively, values of non-binding parameters MAY be specified as common expressions OData-URL, section “Common Expression Syntax”. In the case of a bound action these MAY contain path expressions OData-URL, section “Path Expressions”, which the service evaluates on the binding parameter value. Such parameters are encoded as name/value pairs where the name is the name of the parameter followed by @expression and the value is the common expression. As the following example demonstrates, non-transient entities can be passed as non-binding action parameters through a resource path in this way.

+

Alternatively, values of non-binding parameters MAY be specified as common expressions OData-URL, section 5.1.1. In the case of a bound action these MAY contain path expressions OData-URL, section 5.1.1.15, which the service evaluates on the binding parameter value. Such parameters are encoded as name/value pairs where the name is the name of the parameter followed by @expression and the value is the common expression. As the following example demonstrates, non-transient entities can be passed as non-binding action parameters through a resource path in this way.

Example 53: An employee requests leave from their manager for the next two weeks:

POST /service/Employees(23)/self.RequestLeave
@@ -2085,7 +2085,7 @@ 

"Approver@expression": "$root/services/Employee(23)/Manager" }

-

Inside a batch request the common expressions can also be value references starting with $, as introduced in OData-Protocol, section “Referencing Values from Response Bodies”.

+

Inside a batch request the common expressions can also be value references starting with $, as introduced in OData-Protocol, section 11.7.6.

Non-binding parameters that are nullable or annotated with the term Core.OptionalParameter defined in OData-VocCore MAY be omitted from the request body. If an omitted parameter is not annotated (and thus nullable), it MUST be interpreted as having the null value. If it is annotated and the annotation specifies a DefaultValue, the omitted parameter is interpreted as having that default value. If omitted and the annotation does not specify a default value, the service is free on how to interpret the omitted parameter. Note: a nullable non-binding parameter is equivalent to being annotated as optional with a default value of null.

Example 54:

@@ -2360,7 +2360,7 @@

19.6 Bat

19.7 Asynchronous Batch Requests

-

A batch request that specifies the respond-async preference MAY be executed asynchronously. This means that the “outer” batch request is executed asynchronously; this preference does not automatically cascade down to the individual requests within the batch. After successful execution of the batch request the response to the batch request is returned in the body of a response to an interrogation request against the status monitor resource URL, see OData-Protocol, section “Asynchronous Requests”.

+

A batch request that specifies the respond-async preference MAY be executed asynchronously. This means that the “outer” batch request is executed asynchronously; this preference does not automatically cascade down to the individual requests within the batch. After successful execution of the batch request the response to the batch request is returned in the body of a response to an interrogation request against the status monitor resource URL, see OData-Protocol, section 11.6.

A service MAY return interim results to an asynchronously executing batch. It does this by responding with 200 OK to a GET request to the monitor resource and including a nextLink control information in the JSON batch response, thus signaling that the response is only a partial result. A subsequent GET request to the next link MAY result in a 202 Accepted response with a location header pointing to a new status monitor resource.

Example 60: referencing the example 55 above again, assume that the request is sent with the respond-async preference. This results in a 202 response pointing to a status monitor resource:

diff --git a/docs/odata-json-format/odata-json-format.md b/docs/odata-json-format/odata-json-format.md index 53f78b14..2dccc6fe 100644 --- a/docs/odata-json-format/odata-json-format.md +++ b/docs/odata-json-format/odata-json-format.md @@ -911,7 +911,7 @@ metadata document of a different service ### 4.6.4 Control Information: `count` (`odata.count`) The `count` control information occurs only in responses and -can annotate any collection, see [OData-Protocol, section "System Query Option `$count`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptioncount). +can annotate any collection, see [OData-Protocol, section 11.2.6.5](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptioncount). Its value is an `Edm.Int64` value corresponding to the total count of members in the collection represented by the request. @@ -1084,8 +1084,8 @@ For [media entities](#MediaEntity) and [stream properties](#StreamProperty) at least one of the control information `mediaEditLink` and `mediaReadLink` MUST be included in responses if they don't follow standard URL conventions as defined -in [OData-URL, section "Addressing a Property"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingaProperty) -and [OData-URL, section "Addressing the Media Stream of a Media Entity"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingtheMediaStreamofaMediaEntity), or if +in [OData-URL, section 4.6](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingaProperty) +and [OData-URL, section 4.14](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingtheMediaStreamofaMediaEntity), or if [`metadata=full`](#metadatafullodatametadatafull) is requested. @@ -2099,7 +2099,7 @@ Example 33: collection of entity references # 15 Delta Payload The non-format specific aspects of the delta handling are described in -[OData-Protocol, section "Requesting Changes"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#RequestingChanges). +[OData-Protocol, section 11.3](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#RequestingChanges). ## 15.1 Delta Responses @@ -3110,8 +3110,8 @@ Content-Type: application/json ::: Alternatively, values of non-binding parameters MAY be specified as common expressions -[OData-URL, section "Common Expression Syntax"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax). In the case of a bound action -these MAY contain path expressions [OData-URL, section "Path Expressions"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#PathExpressions), which +[OData-URL, section 5.1.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#CommonExpressionSyntax). In the case of a bound action +these MAY contain path expressions [OData-URL, section 5.1.1.15](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#PathExpressions), which the service evaluates on the binding parameter value. Such parameters are encoded as name/value pairs where the name is the name of the parameter followed by `@expression` and the value is the common expression. As the following example demonstrates, @@ -3150,7 +3150,7 @@ Content-Type: application/json ::: Inside a batch request the common expressions can also be value references -starting with `$`, as introduced in [OData-Protocol, section "Referencing Values from Response Bodies"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ReferencingValuesfromResponseBodies). +starting with `$`, as introduced in [OData-Protocol, section 11.7.6](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#ReferencingValuesfromResponseBodies). Non-binding parameters that are nullable or annotated with the term [`Core.OptionalParameter`](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#OptionalParameter) defined in @@ -3628,7 +3628,7 @@ preference does not automatically cascade down to the individual requests within the batch. After successful execution of the batch request the response to the batch request is returned in the body of a response to an interrogation request against the status monitor resource -URL, see [OData-Protocol, section "Asynchronous Requests"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#AsynchronousRequests). +URL, see [OData-Protocol, section 11.6](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#AsynchronousRequests). A service MAY return interim results to an asynchronously executing batch. It does this by responding with `200 OK` to a diff --git a/docs/odata-protocol/odata-protocol.html b/docs/odata-protocol/odata-protocol.html index 2ab47f6c..67b5040b 100644 --- a/docs/odata-protocol/odata-protocol.html +++ b/docs/odata-protocol/odata-protocol.html @@ -1734,7 +1734,7 @@

11.2.4.1 Requesting Stream Properties

-

If the property being requested has type Edm.Stream (see OData-URL, section “Addressing a Property”), the media type of the response is the media type of the stream, subject to content type negotiation based on the Accept header of the request. The response body is the octet-stream that represents the raw value of the stream property with that media type.

+

If the property being requested has type Edm.Stream (see OData-URL, section 4.6), the media type of the response is the media type of the stream, subject to content type negotiation based on the Accept header of the request. The response body is the octet-stream that represents the raw value of the stream property with that media type.

Note this response format disregards any $format system query option.

@@ -1796,7 +1796,7 @@

OData-URL, section “System Query Option $expand.

+

For a full description of the syntax used when building requests, see OData-URL, section 5.1.3.

Example 38: for each customer entity within the Customers entity set the value of all related Orders will be represented inline

GET http://host/service.svc/Customers?$expand=Orders
@@ -2276,7 +2276,7 @@

Data Modification Request on an existing resource or an Action Request invoking an action bound to an existing resource MAY require optimistic concurrency control. Services SHOULD announce this via annotations with the terms Core.OptimisticConcurrency in OData-VocCore and Capabilities.NavigationRestrictions (nested property OptimisticConcurrencyControl) in OData-VocCap.

-

If optimistic concurrency control is required for a resource, the service MUST include an ETag header in a response to a GET request to the resource, and MAY include the ETag in a format-specific manner in responses containing that resource, see for example OData-JSON, section “Control Information: etag (odata.etag)”.

+

If optimistic concurrency control is required for a resource, the service MUST include an ETag header in a response to a GET request to the resource, and MAY include the ETag in a format-specific manner in responses containing that resource, see for example OData-JSON, section 4.6.10.

The presence of an ETag header in a response does not imply in itself that the resource requires optimistic concurrency control; the ETag may just be used for caching and/or conditional GET requests.

If an ETag value is specified in an If-Match or If-None-Match header of a Data Modification Request or Action Request, the operation MUST only be invoked if the If-Match or If-None-Match condition is satisfied.

If the client does not specify an If-Match request header in a Data Modification Request or Action Request on a resource that requires optimistic concurrency control, the service responds with a 428 Precondition Required and MUST ensure that no observable change occurs as a result of the request. Clients can attempt to disable optimistic concurrency control by specifying If-Match with a value of *. Services MAY reject such requests.

@@ -2322,7 +2322,7 @@

11.

Non-insertable properties SHOULD be omitted from the request body. If they are provided, services MUST either ignore the values in the request body or fail the request if the provided values do not match the service-determined values.

Non-insertable properties include (and are not limited to)

    -
  • dependent properties that are tied to non-key properties of the principal entity through a referential constraint OData-CSDL, section “Referential Constraint” (informally: “denormalized” properties),
  • +
  • dependent properties that are tied to non-key properties of the principal entity through a referential constraint OData-CSDL, section 8.5 (informally: “denormalized” properties),
  • properties annotated with the term Core.Computed, see OData-VocCore,
  • properties listed as NonInsertableProperties of term Capabilities.InsertRestrictions, see OData-VocCap,
  • properties annotated with term Core.Permissions, see OData-VocCore, where the annotation value does not have the Write flag.
  • @@ -2392,7 +2392,7 @@

    11.

    Non-updatable properties include (and are not limited to)

    • key properties,
    • -
    • dependent properties that are tied to non-key properties of the principal entity through a referential constraint OData-CSDL, section “Referential Constraint” (informally: “denormalized” properties),
    • +
    • dependent properties that are tied to non-key properties of the principal entity through a referential constraint OData-CSDL, section 8.5 (informally: “denormalized” properties),
    • properties annotated with the terms Core.Computed or Core.Immutable, see OData-VocCore,
    • properties listed as NonUpdatableProperties of term Capabilities.UpdateRestrictions, see OData-VocCap,
    • properties annotated with term Core.Permissions, see OData-VocCore, where the annotation value does not have the Write flag.
    • @@ -3513,7 +3513,7 @@

      section 11.2.6.4)
    • SHOULD support the $count system query option (section 11.2.6.5)
    • SHOULD support $expand (section 11.2.5.2)
    • -
    • SHOULD support the lambda operators any and all on navigation- and collection-valued properties (OData-URL, section “Lambda Operators”)
    • +
    • SHOULD support the lambda operators any and all on navigation- and collection-valued properties (OData-URL, section 5.1.1.13)
    • SHOULD support the /$count segment on navigation and collection properties (section 11.2.10)
    • SHOULD support $orderby asc and desc on individual properties (section 11.2.6.2)
    • @@ -3527,7 +3527,7 @@

      OData-CSDLXML (section 11.1.2)
    • MUST support the OData-JSON format
    • MUST support the /$count segment on navigation and collection properties (section 11.2.10)
    • -
    • MUST support the lambda operators any and all on navigation- and and collection-valued properties (OData-URL, section “Lambda Operators”)
    • +
    • MUST support the lambda operators any and all on navigation- and and collection-valued properties (OData-URL, section 5.1.1.13)
    • MUST support the $skip system query option (section 11.2.6.4)
    • MUST support the $count system query option (section 11.2.6.5)
    • MUST support $orderby with asc and desc on individual properties (section 11.2.6.2)
    • diff --git a/docs/odata-protocol/odata-protocol.md b/docs/odata-protocol/odata-protocol.md index ef855324..693825de 100644 --- a/docs/odata-protocol/odata-protocol.md +++ b/docs/odata-protocol/odata-protocol.md @@ -2793,7 +2793,7 @@ GET http://host/service/Products(1)/Name #### 11.2.4.1 Requesting Stream Properties If the property being requested has type `Edm.Stream` (see -[OData-URL, section "Addressing a Property"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingaProperty)), the media type of the response is the +[OData-URL, section 4.6](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#AddressingaProperty)), the media type of the response is the media type of the stream, subject to content type negotiation based on the [`Accept`](#HeaderAccept) header of the request. The response body is the octet-stream that represents the raw @@ -2973,7 +2973,7 @@ expand item is evaluated relative to the retrieved resource being expanded. For a full description of the syntax used when building requests, see -[OData-URL, section "System Query Option `$expand`"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#SystemQueryOptionexpand). +[OData-URL, section 5.1.3](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#SystemQueryOptionexpand). ::: example Example 38: for each customer entity within the Customers entity set the @@ -4049,7 +4049,7 @@ If optimistic concurrency control is required for a resource, the service MUST include an [`ETag`](#HeaderETag) header in a response to a `GET` request to the resource, and MAY include the ETag in a format-specific manner in responses containing that resource, -see for example [OData-JSON, section "Control Information: `etag` (`odata.etag`)"](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#ControlInformationetagodataetag). +see for example [OData-JSON, section 4.6.10](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#ControlInformationetagodataetag). The presence of an [`ETag`](#HeaderETag) header in a response does not imply in itself that the resource requires optimistic concurrency @@ -4188,7 +4188,7 @@ if the provided values do not match the service-determined values. Non-insertable properties include (and are not limited to) -- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [OData-CSDL, section "Referential Constraint"](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#ReferentialConstraint) (informally: "denormalized" properties), +- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [OData-CSDL, section 8.5](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#ReferentialConstraint) (informally: "denormalized" properties), - properties annotated with the term [`Core.Computed`](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#Computed), see [OData-VocCore](#ODataVocCore), - properties listed as `NonInsertableProperties` of term [`Capabilities.InsertRestrictions`](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Capabilities.V1.md#InsertRestrictions), see [OData-VocCap](#ODataVocCap), @@ -4379,7 +4379,7 @@ If they are provided, services MUST either ignore the values in the request body Non-updatable properties include (and are not limited to) - key properties, -- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [OData-CSDL, section "Referential Constraint"](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#ReferentialConstraint) (informally: "denormalized" properties), +- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [OData-CSDL, section 8.5](https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html#ReferentialConstraint) (informally: "denormalized" properties), - properties annotated with the terms [`Core.Computed`](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#Computed) or [`Core.Immutable`](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md#Immutable), see [OData-VocCore](#ODataVocCore), - properties listed as `NonUpdatableProperties` of term [`Capabilities.UpdateRestrictions`](https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Capabilities.V1.md#UpdateRestrictions), see [OData-VocCap](#ODataVocCap), @@ -6692,7 +6692,7 @@ with generic clients 13. SHOULD support the `$count` system query option ([section 11.2.6.5](#SystemQueryOptioncount)) 14. SHOULD support `$expand` ([section 11.2.5.2](#SystemQueryOptionexpand)) 15. SHOULD support the lambda operators `any` and `all` on navigation- -and collection-valued properties ([OData-URL, section "Lambda Operators"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#LambdaOperators)) +and collection-valued properties ([OData-URL, section 5.1.1.13](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#LambdaOperators)) 16. SHOULD support the `/$count` segment on navigation and collection properties ([section 11.2.10](#RequestingtheNumberofItemsinaCollection)) 17. SHOULD support `$orderby asc` and `desc` on individual properties @@ -6710,7 +6710,7 @@ Level](#OData40IntermediateConformanceLevel) 4. MUST support the `/$count` segment on navigation and collection properties ([section 11.2.10](#RequestingtheNumberofItemsinaCollection)) 5. MUST support the lambda operators `any` and `all` on navigation- and -and collection-valued properties ([OData-URL, section "Lambda Operators"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#LambdaOperators)) +and collection-valued properties ([OData-URL, section 5.1.1.13](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html#LambdaOperators)) 6. MUST support the `$skip` system query option ([section 11.2.6.4](#SystemQueryOptionskip)) 7. MUST support the `$count` system query option ([section 11.2.6.5](#SystemQueryOptioncount)) 8. MUST support `$orderby` with `asc` and `desc` on individual properties diff --git a/docs/odata-temporal-ext/odata-temporal-ext.html b/docs/odata-temporal-ext/odata-temporal-ext.html index a179ca07..e5101e38 100644 --- a/docs/odata-temporal-ext/odata-temporal-ext.html +++ b/docs/odata-temporal-ext/odata-temporal-ext.html @@ -1829,7 +1829,7 @@

      4.2.4 Interaction with Standard System Query Options

For snapshot entity sets the point in time for representing data is determined following the rules in section 4.2.1 and evaluated first, then all other system query options are evaluated on the data valid at that point in time, including the query option $apply defined in OData-Aggregation.

-

For timeline entity sets the interval for filtering data is determined following the rules in section 4.2.1 and evaluated as an additional criterion for $filter in the evaluation sequence defined in OData-Protocol, section “System Query Options”, which is evaluated after the query option $apply.

+

For timeline entity sets the interval for filtering data is determined following the rules in section 4.2.1 and evaluated as an additional criterion for $filter in the evaluation sequence defined in OData-Protocol, section 11.2.1, which is evaluated after the query option $apply.

Example 16: retrieve employee history over a period of application time and filter on job title

GET /api-2/Employees?$expand=history(
diff --git a/docs/odata-temporal-ext/odata-temporal-ext.md b/docs/odata-temporal-ext/odata-temporal-ext.md
index 363558a5..680d0dfe 100644
--- a/docs/odata-temporal-ext/odata-temporal-ext.md
+++ b/docs/odata-temporal-ext/odata-temporal-ext.md
@@ -1846,7 +1846,7 @@ on the data valid at that point in time, including the query option
 For timeline entity sets the interval for filtering data is determined
 following the rules in [section 4.2.1](#PropagationofTemporalQueryOptions)
 and evaluated as an additional criterion for `$filter` in the evaluation
-sequence defined in [OData-Protocol, section "System Query Options"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptions),
+sequence defined in [OData-Protocol, section 11.2.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#SystemQueryOptions),
 which is evaluated _after_ the query option `$apply`.
 
 ::: example
diff --git a/docs/odata-url-conventions/odata-url-conventions.html b/docs/odata-url-conventions/odata-url-conventions.html
index 2312a06a..bbd44a56 100644
--- a/docs/odata-url-conventions/odata-url-conventions.html
+++ b/docs/odata-url-conventions/odata-url-conventions.html
@@ -1081,7 +1081,7 @@ 

"$select": "FirstName,LastName" }

-

Members of the JSON object also include parameters if the resource path is a function invocation or function import. In this case parameters MUST be represented like parameters in an action invocation OData-JSON, section “Action Invocation”, and in the resource path parentheses after the function name MUST be omitted.

+

Members of the JSON object also include parameters if the resource path is a function invocation or function import. In this case parameters MUST be represented like parameters in an action invocation OData-JSON, section 18, and in the resource path parentheses after the function name MUST be omitted.

Example 53: An employee’s top ten leave requests from now to the end of the year pending their manager’s approval.

POST http://host/service/Employees(23)/self.PendingLeaveRequests/$query
@@ -1093,7 +1093,7 @@ 

"Approver@expression": "Manager", "$top": 10 }

-

The previous request looks analogous to a bound function invocation with expressions (like in example 30) if it is written using implicit parameter aliases (see OData-Protocol, section “Inline Parameter Syntax”).

+

The previous request looks analogous to a bound function invocation with expressions (like in example 30) if it is written using implicit parameter aliases (see OData-Protocol, section 11.5.4.1.1).

GET http://host/service/Employees(23)/self.PendingLeaveRequests
   ?StartDate=now()
   &EndDate=2024-12-31
@@ -1965,7 +1965,7 @@ 
OData-JSON, section “Entity”. Non-transient entities can alternatively be represented through their resource path.

+

Entities are represented as structured literals as described in OData-JSON, section 6. Non-transient entities can alternatively be represented through their resource path.

Example 111: determine the price of an adhoc-defined product

http://host/service/Price(Product=@p)?@p={"Color":"red"}
diff --git a/docs/odata-url-conventions/odata-url-conventions.md b/docs/odata-url-conventions/odata-url-conventions.md index ddaeb187..4bcabcfd 100644 --- a/docs/odata-url-conventions/odata-url-conventions.md +++ b/docs/odata-url-conventions/odata-url-conventions.md @@ -1542,7 +1542,7 @@ Content-Type: application/json Members of the JSON object also include parameters if the resource path is a function invocation or function import. In this case -parameters MUST be represented like parameters in an action invocation [OData-JSON, section "Action Invocation"](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#ActionInvocation), +parameters MUST be represented like parameters in an action invocation [OData-JSON, section 18](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#ActionInvocation), and in the resource path parentheses after the function name MUST be omitted. ::: example @@ -1561,7 +1561,7 @@ Content-Type: application/json ``` The previous request looks analogous to a bound function invocation with expressions (like in [example 30](#funcexpr)) -if it is written using implicit parameter aliases (see [OData-Protocol, section "Inline Parameter Syntax"](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#InlineParameterSyntax)). +if it is written using implicit parameter aliases (see [OData-Protocol, section 11.5.4.1.1](https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html#InlineParameterSyntax)). ``` GET http://host/service/Employees(23)/self.PendingLeaveRequests ?StartDate=now() @@ -3279,7 +3279,7 @@ $filter=[FirstName,LastName] in [["John","Doe"],["Jane","Smith"]] ``` ::: -Entities are represented as structured literals as described in [OData-JSON, section "Entity"](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#Entity). +Entities are represented as structured literals as described in [OData-JSON, section 6](https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html#Entity). Non-transient entities can alternatively be represented through their [resource path](#ResourcePath). ::: example diff --git a/lib/README.md b/lib/README.md index bbb408f6..098790e3 100644 --- a/lib/README.md +++ b/lib/README.md @@ -13,6 +13,8 @@ This folder contains several Node.js modules that generate OASIS specification d See [subsection ##SubsectionHeading]. Reference to a subsection showing its number. See [this example](#aggregation). Reference to an example. See [example ##aggregation]. Reference to an example showing its number. + See [#OData-Protocol#SectionHeading]. Cross-document section reference. + See [OData-Protocol, example #OData-Protocol#aggregation]. Other cross-document reference. [This important sentence]{id=important} is referenced [elsewhere](#important). ``` - Lines ending with single space are joined with the next line. diff --git a/lib/build.js b/lib/build.js index 28504b68..cddab9cd 100644 --- a/lib/build.js +++ b/lib/build.js @@ -5,6 +5,7 @@ const pandoc = require("./pandoc"); const { PassThrough } = require("stream"); var docs = []; +var builders = []; iterator(function (srcname, name, variant, meta) { docs.push(`* [${meta.pagetitle} - ${meta.subtitle}](${name}/${name}.html)`); if (meta.repo && !process.argv.includes("repo:" + meta.repo)) return; @@ -26,28 +27,35 @@ iterator(function (srcname, name, variant, meta) { html.stdout.pipe( fs.createWriteStream(`${__dirname}/../docs/${name}/${name}.html`), ); - new Number(`${__dirname}/../${srcname}`, variant, meta) - .build( - new PassThrough() - .on("data", function (chunk) { - md.write(chunk); - html.stdin.write(chunk); - }) - .on("end", function () { - md.end(); - html.stdin.end(); - }), - ) - .then(() => { + builders.push({ + number: new Number(`${__dirname}/../${srcname}`, variant, meta), + out: new PassThrough() + .on("data", function (chunk) { + md.write(chunk); + html.stdin.write(chunk); + }) + .on("end", function () { + md.end(); + html.stdin.end(); + }), + then() { console.log("✓", srcname, variant === "meta" ? "" : variant); - }) - .catch((err) => { + }, + catch(err) { console.log("❌", srcname, variant === "meta" ? "" : variant); console.error(err.join("\n")); console.error(); process.exitCode = 1; - }); + }, + }); }); + +Promise.all(builders.map((build) => build.number.read())).then(function () { + builders.forEach(function (build) { + build.number.write(build.out).then(build.then, build.catch); + }); +}); + fs.writeFileSync( `${__dirname}/../docs/index.md`, `# OData Specification Drafts diff --git a/lib/iterator.js b/lib/iterator.js index f2e8cc8b..b39a2947 100644 --- a/lib/iterator.js +++ b/lib/iterator.js @@ -13,12 +13,15 @@ module.exports = function (callback) { const meta = yaml.load( fs.readFileSync(`${__dirname}/../${doc.name}/${metaname}`), ); - const name = - metaname === "meta.yaml" || !meta.dirname ? doc.name : meta.dirname; - callback(doc.name, name, metaname.substring(0, metaname.length - 5), { - ...metameta, - ...meta, - }); + callback( + doc.name, + metaname === "meta.yaml" || !meta.dirname ? doc.name : meta.dirname, + metaname.substring(0, metaname.length - 5), + { + ...metameta, + ...meta, + }, + ); }); } }); diff --git a/lib/number.js b/lib/number.js index df682e99..32c90b0f 100644 --- a/lib/number.js +++ b/lib/number.js @@ -18,6 +18,8 @@ if ( process.exit(1); } +var builders = {}; + class Number { constructor(dir, variant, meta) { this.dir = dir; @@ -28,6 +30,7 @@ class Number { .sort(compareSectionNumbers); this.meta = meta; this.meta["pandoc-version"] = pandoc; + if (meta.name) builders[meta.name] = this; } secno(type) { @@ -208,15 +211,22 @@ class Number { } out.write( outline.replace( - /##([A-Za-z0-9.]+)\]/g, - function (m, p) { - var r = this.refs[p]; - if (r) return `${r}](#${p})`; + /(\[?)#([-A-Za-z0-9]*)#([A-Za-z0-9.]+)\]/g, + function (m, o, d, p) { + var f, r; + if (d && (r = builders[d]?.refs[p])) { + if (o) r = `${d}, section ${r}`; + f = builders[d].meta.url; + } else if (!d) { + r = this.refs[p]; + f = ""; + } + if (r) return `${o}${r}](${f}#${p})`; else { this.errors.push( - `${this.dir}/${file}(${lineno}): Undefined link ##${p}`, + `${this.dir}/${file}(${lineno}): Undefined link #${d}#${p}`, ); - return `~~${p}~~]`; + return `${o}~~${d}#${p}~~]`; } }.bind(this), ), @@ -244,7 +254,7 @@ class Number { } } - async build(out) { + async read() { this.errors = []; this.counter = {}; this.refs = {}; @@ -252,8 +262,11 @@ class Number { this.toc = { "": { sub: [] } }; this.match = 0; for (var c of this.chapters) await this.phase1(c); + } + + async write(out) { this.match = 0; - for (c of this.chapters) { + for (var c of this.chapters) { await this.phase2(c, out); out.write("\n"); if (c[0] === "0") { @@ -265,6 +278,11 @@ class Number { out.end(); if (this.errors.length > 0) throw this.errors; } + + async build(out) { + await this.read(); + await this.write(out); + } } module.exports = Number; diff --git a/meta.yaml b/meta.yaml index da429043..b6dc4acc 100644 --- a/meta.yaml +++ b/meta.yaml @@ -1,10 +1,3 @@ -OData-CSDLJSON: https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html -OData-CSDLXML: https://docs.oasis-open.org/odata/odata-csdl-xml/v4.02/odata-csdl-xml-v4.02.html -OData-JSON: https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html -OData-Data-Agg: https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/odata-data-aggregation-ext-v4.0.html -OData-Temporal: https://docs.oasis-open.org/odata/odata-temporal-ext/v4.0/odata-temporal-ext-v4.0.html -OData-Protocol: https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html -OData-URL: https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html OData-VocCore: https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Core.V1.md OData-VocCap: https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Capabilities.V1.md OData-VocAggr: https://github.com/oasis-tcs/odata-vocabularies/blob/main/vocabularies/Org.OData.Aggregation.V1.md \ No newline at end of file diff --git a/odata-csdl/12 Action and Function.md b/odata-csdl/12 Action and Function.md index 477c30ee..99c0b3ac 100644 --- a/odata-csdl/12 Action and Function.md +++ b/odata-csdl/12 Action and Function.md @@ -162,7 +162,7 @@ Unbound actions are invoked from the entity container through an [action import](#ActionImport). Unbound functions are invoked as static functions within a common expression -(see [OData-URL, section "Common Expression Syntax"]($$$OData-URL$$$#CommonExpressionSyntax)), +(see [#OData-URL#CommonExpressionSyntax]), or from the entity container through a [function import](#FunctionImport). ::: {.varjson .rep} diff --git a/odata-csdl/14 Vocabulary and Annotation.md b/odata-csdl/14 Vocabulary and Annotation.md index 0e7f4167..c55ed3bc 100644 --- a/odata-csdl/14 Vocabulary and Annotation.md +++ b/odata-csdl/14 Vocabulary and Annotation.md @@ -2570,7 +2570,7 @@ Name property of the Actor entity The `odata.matchesPattern` client-side function takes two string expressions as arguments and returns a Boolean value. -It is the counterpart of the identically named URL function [OData-URL, section "`matchespattern`"]($$$OData-URL$$$#matchespattern). +It is the counterpart of the identically named URL function [#OData-URL#matchespattern]. The function returns true if the second expression evaluates to an [ECMAScript](#_ECMAScript) (JavaScript) regular expression and diff --git a/odata-csdl/json.yaml b/odata-csdl/json.yaml index 0bcc584b..fd3b8f6b 100644 --- a/odata-csdl/json.yaml +++ b/odata-csdl/json.yaml @@ -1,3 +1,5 @@ +name: OData-CSDL +url: https://docs.oasis-open.org/odata/odata-csdl-json/v4.02/odata-csdl-json-v4.02.html pagetitle: OData Common Schema Definition Language (CSDL) JSON Representation Version 4.02 subtitle: Committee Specification Draft 02 dirname: odata-csdl-json diff --git a/odata-csdl/xml.yaml b/odata-csdl/xml.yaml index 5bff1a54..7a3f06b0 100644 --- a/odata-csdl/xml.yaml +++ b/odata-csdl/xml.yaml @@ -1,3 +1,5 @@ +name: OData-CSDLXML +url: https://docs.oasis-open.org/odata/odata-csdl-xml/v4.02/odata-csdl-xml-v4.02.html pagetitle: OData Common Schema Definition Language (CSDL) XML Representation Version 4.02 subtitle: Committee Specification Draft 02 dirname: odata-csdl-xml diff --git a/odata-data-aggregation-ext/3.1 Fundamentals of Input and Output Sets.md b/odata-data-aggregation-ext/3.1 Fundamentals of Input and Output Sets.md index 66619aa4..ab9da56e 100644 --- a/odata-data-aggregation-ext/3.1 Fundamentals of Input and Output Sets.md +++ b/odata-data-aggregation-ext/3.1 Fundamentals of Input and Output Sets.md @@ -7,7 +7,7 @@ A _set transformation_ (_transformation_ for short) is an operation on an input The system query option `$apply` MUST NOT be used if the resource path addresses a single instance. -The system query option `$apply` is evaluated first, then the other system query options are evaluated, if applicable, on the result of `$apply`, see [OData-Protocol, section "System Query Options"]($$$OData-Protocol$$$#SystemQueryOptions). Stability across requests for system query options `$top` and `$skip` [OData-Protocol, sections "System Query Option `$top`" and "System Query Option `$skip`"]($$$OData-Protocol$$$#SystemQueryOptiontop) is defined in [section ##StableTotalOrderBeforeskipandtop]. +The system query option `$apply` is evaluated first, then the other system query options are evaluated, if applicable, on the result of `$apply`, see [#OData-Protocol#SystemQueryOptions]. Stability across requests for system query options `$top` and `$skip` [#OData-Protocol#SystemQueryOptiontop] is defined in [section ##StableTotalOrderBeforeskipandtop]. Each set transformation: - carries over the input type to the output set such that it fits into the data model of the service. @@ -33,13 +33,13 @@ The definitions of italicized terms made in this section are used throughout thi ### ##subsubsec Type, Structure and Context URL -All input sets and output sets in one transformation sequence are collections of the _input type_, that is the entity type or complex type of the first input set, or in other words, of the resource to which the transformation sequence is applied. The input type is determined by the entity model element identified within the metadata document by the context URL of that resource [OData-Protocol, section "Context URL"]($$$OData-Protocol$$$#ContextURL). Individual instances in an input or output set can have a subtype of the input type. (See [example ##subinputtype].) The transformation sequence given as the `$apply` system query option is applied to the resource addressed by the resource path. The transformations defined below can have nested transformation sequences as parameters, these are then applied to resources that can differ from the current input set. +All input sets and output sets in one transformation sequence are collections of the _input type_, that is the entity type or complex type of the first input set, or in other words, of the resource to which the transformation sequence is applied. The input type is determined by the entity model element identified within the metadata document by the context URL of that resource [#OData-Protocol#ContextURL]. Individual instances in an input or output set can have a subtype of the input type. (See [example ##subinputtype].) The transformation sequence given as the `$apply` system query option is applied to the resource addressed by the resource path. The transformations defined below can have nested transformation sequences as parameters, these are then applied to resources that can differ from the current input set. The _structure_ of an instance that occurs in an input or output set is defined by the names of the structural and navigation properties that the instance contains. Instances of an input type can have different structures, subject to the following rules: - Declared properties of the input type or a nested or related type thereof or of a subtype of one of these MUST have their declared type and meaning when they occur in an input or output set. - Single- or collection-valued primitive properties addressed by a property path starting at a non-transient entity MUST keep their values from the addressed resource path collection throughout the transformation sequence. Likewise, single- or collection-valued navigation property paths starting at a non-transient entity MUST keep addressing the same non-transient entities as in the addressed resource path collection. - Instances in an output set need not have all declared or dynamic properties that occurred in the input set. -- Instances in an output set can have dynamic properties that did not occur in the input set. The name for such a dynamic property is called an _alias_, it is a simple identifier (see [OData-CSDL, section "Simple Identifier"]($$$OData-CSDLJSON$$$#SimpleIdentifier)). Aliases MUST differ from names of declared properties in the input type, from names of properties in the first input set, and from names of properties in the current input set. Aliases in one collection MUST also differ from each other. +- Instances in an output set can have dynamic properties that did not occur in the input set. The name for such a dynamic property is called an _alias_, it is a simple identifier (see [#OData-CSDL#SimpleIdentifier]). Aliases MUST differ from names of declared properties in the input type, from names of properties in the first input set, and from names of properties in the current input set. Aliases in one collection MUST also differ from each other. Here is an overview of the structural changes made by different transformations: - During [aggregation](#BasicAggregation) or [nest](#Transformationnest), many instances are replaced by one instance, properties that represent the aggregation level are retained, and others are replaced by dynamic properties holding the aggregate value of the many instances or a transformed copy of them. @@ -48,15 +48,15 @@ Here is an overview of the structural changes made by different transformations: - During [join](#Transformationsjoinandouterjoin), one instance with a collection of related instances is replaced by many copies, each of which is related via a dynamic property to one of the related instances. - During [concatenation](#Transformationconcat), the same instances are transformed multiple times and the output sets with their potentially different structures are concatenated. -An output set thus consists of instances with different structures. This is the same situation as with a collection of an open type ([OData-CSDL, section "Open Entity Type"]($$$OData-CSDLJSON$$$#OpenEntityType) and [OData-CSDL, section "Open Complex Type"]($$$OData-CSDLJSON$$$#OpenComplexType)) and it is handled in the same way. +An output set thus consists of instances with different structures. This is the same situation as with a collection of an open type ([#OData-CSDL#OpenEntityType] and [#OData-CSDL#OpenComplexType]) and it is handled in the same way. -If the first input set is a collection of entities from a given entity set, then so are all input sets and output sets in the transformation sequence. The `{select-list}` in the context URL [OData-Protocol, section "Context URL"]($$$OData-Protocol$$$#ContextURL) MUST describe only properties that are present or annotated as absent (for example, if `Core.Permissions` is `None` [OData-Protocol, section "Requesting Individual Entities"]($$$OData-Protocol$$$#RequestingIndividualEntities)) in all instances of the collection, after applying any `$select` and `$expand` system query options. The `{select-list}` SHOULD describe as many such properties as possible, even if the request involves a concatenation that leads to a non-homogeneous structure. If the server cannot determine any such properties, the `{select-list}` MUST consist of just the instance annotation `AnyStructure` defined in the [`Core` vocabulary]($$$OData-VocCore$$$#AnyStructure). (See [example ##anystructure].) +If the first input set is a collection of entities from a given entity set, then so are all input sets and output sets in the transformation sequence. The `{select-list}` in the context URL [#OData-Protocol#ContextURL] MUST describe only properties that are present or annotated as absent (for example, if `Core.Permissions` is `None` [#OData-Protocol#RequestingIndividualEntities]) in all instances of the collection, after applying any `$select` and `$expand` system query options. The `{select-list}` SHOULD describe as many such properties as possible, even if the request involves a concatenation that leads to a non-homogeneous structure. If the server cannot determine any such properties, the `{select-list}` MUST consist of just the instance annotation `AnyStructure` defined in the [`Core` vocabulary]($$$OData-VocCore$$$#AnyStructure). (See [example ##anystructure].) ### ##subsubsec Sameness and Order Input sets and output sets are not sets of instances in the mathematical sense but collections, because the same instance can occur multiple times in them. In other words: A collection contains values (which can be instances of structured types or primitive values), possibly with repetitions. The occurrences of the values in the collection form a set in the mathematical sense. The _cardinality_ of a collection is the total number of occurrences in it. When this text describes a transformation algorithmically and stipulates that certain steps are carried out _for each occurrence_ in a collection, this means that the steps are carried out multiple times for the same value if it occurs multiple times in the collection. -A collection addressed by the resource path is returned by the service either as an ordered collection [OData-Protocol, section "Managing Members of an Ordered Collection"]($$$OData-Protocol$$$#ManagingMembersofanOrderedCollection) or as an unordered collection. The same applies to collections that are nested in or related to the addressed resource as well as to collections that are the result of evaluating an expression starting with `$root`, which occur, for example, as the first parameter of a [hierarchical transformation](#HierarchicalTransformations). +A collection addressed by the resource path is returned by the service either as an ordered collection [#OData-Protocol#ManagingMembersofanOrderedCollection] or as an unordered collection. The same applies to collections that are nested in or related to the addressed resource as well as to collections that are the result of evaluating an expression starting with `$root`, which occur, for example, as the first parameter of a [hierarchical transformation](#HierarchicalTransformations). But when such a collection is transformed by the `$apply` system query option, additional cases can arise that are neither ordered nor totally unordered. For example, the [`groupby`](#Transformationgroupby) transformation retains any order within a group but not between groups. @@ -74,15 +74,15 @@ An order of a collection is more precisely defined as follows: Given two differe When transformations are defined in the following sections, the algorithmic description sometimes contains an _order-preserving loop_ over a collection. Such a loop processes the occurrences in an order chosen by the service in such a way that $u_1$ is processed before $u_2$ whenever $u_1$ precedes $u_2$. Likewise, in an _order-preserving sequence_ $u_1,…,u_n$ we have $i @@ -1386,7 +1386,7 @@ Example ##ex_refconstr: If the parent navigation property contained a referentia ``` -then alternatively the property taking part in the referential constraint [OData-Protocol, section "Update a Primitive Property"]($$$OData-Protocol$$$#UpdateaPrimitiveProperty) could be changed to EMEA Central: +then alternatively the property taking part in the referential constraint [#OData-Protocol#UpdateaPrimitiveProperty] could be changed to EMEA Central: ```json PATCH /service/SalesOrganizations('Switzerland') Content-Type: application/json diff --git a/odata-data-aggregation-ext/meta.yaml b/odata-data-aggregation-ext/meta.yaml index 41e3fc88..db75f9c4 100644 --- a/odata-data-aggregation-ext/meta.yaml +++ b/odata-data-aggregation-ext/meta.yaml @@ -1,3 +1,5 @@ +name: OData-Data-Agg +url: https://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/odata-data-aggregation-ext-v4.0.html pagetitle: OData Extension for Data Aggregation Version 4.0 subtitle: Committee Specification 03 filename: odata-data-aggregation-ext-v4.0-cs03 diff --git a/odata-json-format/15 Delta Payload.md b/odata-json-format/15 Delta Payload.md index 3b24945b..95b2bff0 100644 --- a/odata-json-format/15 Delta Payload.md +++ b/odata-json-format/15 Delta Payload.md @@ -4,7 +4,7 @@ # ##sec Delta Payload The non-format specific aspects of the delta handling are described in -[OData-Protocol, section "Requesting Changes"]($$$OData-Protocol$$$#RequestingChanges). +[#OData-Protocol#RequestingChanges]. ## ##subsec Delta Responses diff --git a/odata-json-format/16 Bound Function.md b/odata-json-format/16 Bound Function.md index 3f7d3de6..27e447c5 100644 --- a/odata-json-format/16 Bound Function.md +++ b/odata-json-format/16 Bound Function.md @@ -285,8 +285,8 @@ Content-Type: application/json ::: Alternatively, values of non-binding parameters MAY be specified as common expressions -[OData-URL, section "Common Expression Syntax"]($$$OData-URL$$$#CommonExpressionSyntax). In the case of a bound action -these MAY contain path expressions [OData-URL, section "Path Expressions"]($$$OData-URL$$$#PathExpressions), which +[#OData-URL#CommonExpressionSyntax]. In the case of a bound action +these MAY contain path expressions [#OData-URL#PathExpressions], which the service evaluates on the binding parameter value. Such parameters are encoded as name/value pairs where the name is the name of the parameter followed by `@expression` and the value is the common expression. As the following example demonstrates, @@ -325,7 +325,7 @@ Content-Type: application/json ::: Inside a batch request the common expressions can also be value references -starting with `$`, as introduced in [OData-Protocol, section "Referencing Values from Response Bodies"]($$$OData-Protocol$$$#ReferencingValuesfromResponseBodies). +starting with `$`, as introduced in [#OData-Protocol#ReferencingValuesfromResponseBodies]. Non-binding parameters that are nullable or annotated with the term [`Core.OptionalParameter`]($$$OData-VocCore$$$#OptionalParameter) defined in diff --git a/odata-json-format/19 Batch Requests and Responses.md b/odata-json-format/19 Batch Requests and Responses.md index da57a286..b70c3add 100644 --- a/odata-json-format/19 Batch Requests and Responses.md +++ b/odata-json-format/19 Batch Requests and Responses.md @@ -442,7 +442,7 @@ preference does not automatically cascade down to the individual requests within the batch. After successful execution of the batch request the response to the batch request is returned in the body of a response to an interrogation request against the status monitor resource -URL, see [OData-Protocol, section "Asynchronous Requests"]($$$OData-Protocol$$$#AsynchronousRequests). +URL, see [#OData-Protocol#AsynchronousRequests]. A service MAY return interim results to an asynchronously executing batch. It does this by responding with `200 OK` to a diff --git a/odata-json-format/4 Common Characteristics.md b/odata-json-format/4 Common Characteristics.md index 0ebbeb3b..98448833 100644 --- a/odata-json-format/4 Common Characteristics.md +++ b/odata-json-format/4 Common Characteristics.md @@ -364,7 +364,7 @@ metadata document of a different service ### ##subsubsec Control Information: `count` (`odata.count`) The `count` control information occurs only in responses and -can annotate any collection, see [OData-Protocol, section "System Query Option `$count`"]($$$OData-Protocol$$$#SystemQueryOptioncount). +can annotate any collection, see [#OData-Protocol#SystemQueryOptioncount]. Its value is an `Edm.Int64` value corresponding to the total count of members in the collection represented by the request. @@ -537,8 +537,8 @@ For [media entities](#MediaEntity) and [stream properties](#StreamProperty) at least one of the control information `mediaEditLink` and `mediaReadLink` MUST be included in responses if they don't follow standard URL conventions as defined -in [OData-URL, section "Addressing a Property"]($$$OData-URL$$$#AddressingaProperty) -and [OData-URL, section "Addressing the Media Stream of a Media Entity"]($$$OData-URL$$$#AddressingtheMediaStreamofaMediaEntity), or if +in [#OData-URL#AddressingaProperty] +and [#OData-URL#AddressingtheMediaStreamofaMediaEntity], or if [`metadata=full`](#metadatafullodatametadatafull) is requested. diff --git a/odata-json-format/meta.yaml b/odata-json-format/meta.yaml index a17de4fe..b6d120e7 100644 --- a/odata-json-format/meta.yaml +++ b/odata-json-format/meta.yaml @@ -1,3 +1,5 @@ +name: OData-JSON +url: https://docs.oasis-open.org/odata/odata-json-format/v4.02/odata-json-format-v4.02.html pagetitle: OData JSON Format Version 4.02 subtitle: Committee Specification Draft 02 filename: odata-json-format-v4.02-csd02 diff --git a/odata-protocol/11 Data Service Requests.md b/odata-protocol/11 Data Service Requests.md index 7fc550d3..e122e92a 100644 --- a/odata-protocol/11 Data Service Requests.md +++ b/odata-protocol/11 Data Service Requests.md @@ -231,7 +231,7 @@ GET http://host/service/Products(1)/Name #### ##subsubsubsec Requesting Stream Properties If the property being requested has type `Edm.Stream` (see -[OData-URL, section "Addressing a Property"]($$$OData-URL$$$#AddressingaProperty)), the media type of the response is the +[#OData-URL#AddressingaProperty]), the media type of the response is the media type of the stream, subject to content type negotiation based on the [`Accept`](#HeaderAccept) header of the request. The response body is the octet-stream that represents the raw @@ -411,7 +411,7 @@ expand item is evaluated relative to the retrieved resource being expanded. For a full description of the syntax used when building requests, see -[OData-URL, section "System Query Option `$expand`"]($$$OData-URL$$$#SystemQueryOptionexpand). +[#OData-URL#SystemQueryOptionexpand]. ::: example Example ##ex: for each customer entity within the Customers entity set the diff --git a/odata-protocol/11.4 Data Modification.md b/odata-protocol/11.4 Data Modification.md index b63b1a9b..addff612 100644 --- a/odata-protocol/11.4 Data Modification.md +++ b/odata-protocol/11.4 Data Modification.md @@ -46,7 +46,7 @@ If optimistic concurrency control is required for a resource, the service MUST include an [`ETag`](#HeaderETag) header in a response to a `GET` request to the resource, and MAY include the ETag in a format-specific manner in responses containing that resource, -see for example [OData-JSON, section "Control Information: `etag` (`odata.etag`)"]($$$OData-JSON$$$#ControlInformationetagodataetag). +see for example [#OData-JSON#ControlInformationetagodataetag]. The presence of an [`ETag`](#HeaderETag) header in a response does not imply in itself that the resource requires optimistic concurrency @@ -185,7 +185,7 @@ if the provided values do not match the service-determined values. Non-insertable properties include (and are not limited to) -- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [OData-CSDL, section "Referential Constraint"]($$$OData-CSDLJSON$$$#ReferentialConstraint) (informally: "denormalized" properties), +- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [#OData-CSDL#ReferentialConstraint] (informally: "denormalized" properties), - properties annotated with the term [`Core.Computed`]($$$OData-VocCore$$$#Computed), see [OData-VocCore](#ODataVocCore), - properties listed as `NonInsertableProperties` of term [`Capabilities.InsertRestrictions`]($$$OData-VocCap$$$#InsertRestrictions), see [OData-VocCap](#ODataVocCap), @@ -376,7 +376,7 @@ If they are provided, services MUST either ignore the values in the request body Non-updatable properties include (and are not limited to) - key properties, -- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [OData-CSDL, section "Referential Constraint"]($$$OData-CSDLJSON$$$#ReferentialConstraint) (informally: "denormalized" properties), +- dependent properties that are tied to non-key properties of the principal entity through a referential constraint [#OData-CSDL#ReferentialConstraint] (informally: "denormalized" properties), - properties annotated with the terms [`Core.Computed`]($$$OData-VocCore$$$#Computed) or [`Core.Immutable`]($$$OData-VocCore$$$#Immutable), see [OData-VocCore](#ODataVocCore), - properties listed as `NonUpdatableProperties` of term [`Capabilities.UpdateRestrictions`]($$$OData-VocCap$$$#UpdateRestrictions), see [OData-VocCap](#ODataVocCap), diff --git a/odata-protocol/12 Conformance.md b/odata-protocol/12 Conformance.md index b9fbed04..13adc84b 100644 --- a/odata-protocol/12 Conformance.md +++ b/odata-protocol/12 Conformance.md @@ -153,7 +153,7 @@ with generic clients 13. SHOULD support the `$count` system query option ([section ##SystemQueryOptioncount]) 14. SHOULD support `$expand` ([section ##SystemQueryOptionexpand]) 15. SHOULD support the lambda operators `any` and `all` on navigation- -and collection-valued properties ([OData-URL, section "Lambda Operators"]($$$OData-URL$$$#LambdaOperators)) +and collection-valued properties ([#OData-URL#LambdaOperators]) 16. SHOULD support the `/$count` segment on navigation and collection properties ([section ##RequestingtheNumberofItemsinaCollection]) 17. SHOULD support `$orderby asc` and `desc` on individual properties @@ -171,7 +171,7 @@ Level](#OData40IntermediateConformanceLevel) 4. MUST support the `/$count` segment on navigation and collection properties ([section ##RequestingtheNumberofItemsinaCollection]) 5. MUST support the lambda operators `any` and `all` on navigation- and -and collection-valued properties ([OData-URL, section "Lambda Operators"]($$$OData-URL$$$#LambdaOperators)) +and collection-valued properties ([#OData-URL#LambdaOperators]) 6. MUST support the `$skip` system query option ([section ##SystemQueryOptionskip]) 7. MUST support the `$count` system query option ([section ##SystemQueryOptioncount]) 8. MUST support `$orderby` with `asc` and `desc` on individual properties diff --git a/odata-protocol/meta.yaml b/odata-protocol/meta.yaml index fc2265cc..3133d04e 100644 --- a/odata-protocol/meta.yaml +++ b/odata-protocol/meta.yaml @@ -1,3 +1,5 @@ +name: OData-Protocol +url: https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part1-protocol.html pagetitle: 'OData Version 4.02. Part 1: Protocol' subtitle: Committee Specification Draft 02 filename: odata-v4.02-csd02-part1-protocol diff --git a/odata-temporal-ext/4 Temporal Requests.md b/odata-temporal-ext/4 Temporal Requests.md index fd8c7dc1..3d785603 100644 --- a/odata-temporal-ext/4 Temporal Requests.md +++ b/odata-temporal-ext/4 Temporal Requests.md @@ -441,7 +441,7 @@ on the data valid at that point in time, including the query option For timeline entity sets the interval for filtering data is determined following the rules in [section ##PropagationofTemporalQueryOptions] and evaluated as an additional criterion for `$filter` in the evaluation -sequence defined in [OData-Protocol, section "System Query Options"]($$$OData-Protocol$$$#SystemQueryOptions), +sequence defined in [#OData-Protocol#SystemQueryOptions], which is evaluated _after_ the query option `$apply`. ::: example diff --git a/odata-temporal-ext/meta.yaml b/odata-temporal-ext/meta.yaml index bab27ff9..c6dc6a35 100644 --- a/odata-temporal-ext/meta.yaml +++ b/odata-temporal-ext/meta.yaml @@ -1,3 +1,5 @@ +name: OData-Temporal +url: https://docs.oasis-open.org/odata/odata-temporal-ext/v4.0/odata-temporal-ext-v4.0.html pagetitle: OData Extension for Temporal Data Version 4.0 subtitle: Committee Specification Draft 04 filename: odata-temporal-ext-v4.0-csd04 diff --git a/odata-url-conventions/4 Resource Path.md b/odata-url-conventions/4 Resource Path.md index 4a63bbcc..bc00cc85 100644 --- a/odata-url-conventions/4 Resource Path.md +++ b/odata-url-conventions/4 Resource Path.md @@ -1086,7 +1086,7 @@ Content-Type: application/json Members of the JSON object also include parameters if the resource path is a function invocation or function import. In this case -parameters MUST be represented like parameters in an action invocation [OData-JSON, section "Action Invocation"]($$$OData-JSON$$$#ActionInvocation), +parameters MUST be represented like parameters in an action invocation [#OData-JSON#ActionInvocation], and in the resource path parentheses after the function name MUST be omitted. ::: example @@ -1105,7 +1105,7 @@ Content-Type: application/json ``` The previous request looks analogous to a bound function invocation with expressions (like in [example ##funcexpr]) -if it is written using implicit parameter aliases (see [OData-Protocol, section "Inline Parameter Syntax"]($$$OData-Protocol$$$#InlineParameterSyntax)). +if it is written using implicit parameter aliases (see [#OData-Protocol#InlineParameterSyntax]). ``` GET http://host/service/Employees(23)/self.PendingLeaveRequests ?StartDate=now() diff --git a/odata-url-conventions/5 Query Options.md b/odata-url-conventions/5 Query Options.md index 22058ed7..34bd79ca 100644 --- a/odata-url-conventions/5 Query Options.md +++ b/odata-url-conventions/5 Query Options.md @@ -1706,7 +1706,7 @@ $filter=[FirstName,LastName] in [["John","Doe"],["Jane","Smith"]] ``` ::: -Entities are represented as structured literals as described in [OData-JSON, section "Entity"]($$$OData-JSON$$$#Entity). +Entities are represented as structured literals as described in [#OData-JSON#Entity]. Non-transient entities can alternatively be represented through their [resource path](#ResourcePath). ::: example diff --git a/odata-url-conventions/meta.yaml b/odata-url-conventions/meta.yaml index 9a879d98..b5a53d9c 100644 --- a/odata-url-conventions/meta.yaml +++ b/odata-url-conventions/meta.yaml @@ -1,3 +1,5 @@ +name: OData-URL +url: https://docs.oasis-open.org/odata/odata/v4.02/odata-v4.02-part2-url-conventions.html pagetitle: 'OData Version 4.02. Part 2: URL Conventions' subtitle: Committee Specification Draft 02 filename: odata-v4.02-csd02-part2-url-conventions diff --git a/package-lock.json b/package-lock.json index 6f2019c2..e8591d31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -708,6 +708,7 @@ "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -789,6 +790,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -822,6 +824,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -979,6 +982,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1093,6 +1097,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -1112,6 +1117,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1142,6 +1148,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1150,6 +1157,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1177,7 +1185,8 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -1188,6 +1197,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1221,6 +1231,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1232,6 +1243,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1247,7 +1259,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -1316,6 +1329,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1340,6 +1354,7 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -1451,6 +1466,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -1511,6 +1527,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1551,6 +1568,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1567,6 +1585,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1696,6 +1715,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -1720,6 +1740,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -1731,6 +1752,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1742,6 +1764,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1753,6 +1776,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1777,6 +1801,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1864,6 +1889,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -2259,6 +2285,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2267,6 +2294,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -2283,6 +2311,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2424,7 +2453,8 @@ "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.3", @@ -2466,6 +2496,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2477,6 +2508,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -2624,6 +2656,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2678,7 +2711,8 @@ "node_modules/path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" }, "node_modules/pend": { "version": "1.2.0", @@ -2856,6 +2890,7 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -2883,6 +2918,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2891,6 +2927,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -3021,7 +3058,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/semver": { "version": "7.6.3", @@ -3039,6 +3077,7 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -3062,6 +3101,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3069,7 +3109,8 @@ "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.0", @@ -3083,6 +3124,7 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -3097,6 +3139,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3112,7 +3155,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -3137,6 +3181,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -3236,6 +3281,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3422,6 +3468,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -3436,6 +3483,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3474,6 +3522,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" }