Skip to content

Conversation

@vmikhailenko
Copy link
Contributor

The application developers are now exposed to the concept of references via arguments of custom handlers.

They should now what these are and how you supposed to work with them.

We can also improve the APIs a bit as some of these look rather ugly.

@renejeglinsky renejeglinsky added the AI Review AI generated suggestions label Nov 5, 2025
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4467 | Completion Tokens: 2078

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4495 | Completion Tokens: 2260

@renejeglinsky
Copy link
Contributor

Hi @vmikhailenko ,
I enabled an AI editing workflow and would like to collect your feedback on the current suggestions. Please go through the suggestions and apply the ones you deem helpful. Afterwards please send me a little feedback/summary of what you think it does good and what you didn't like. Thank you :)

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a collaborative code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full creative control over your code—AI simply provides additional perspective to support your decision-making process. Use whatever feels valuable and aligns with your project goals.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4523 | Completion Tokens: 635

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4261 | Completion Tokens: 587

}
```

Below is an example how this can be used together to build an CQL statement:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar error: Missing article 'a' before 'CQL statement'. The sentence should read: 'Below is an example of how this can be used together to build a CQL statement:'

The references are not comparable between each other. They cannot be used as map keys or set values.
:::

### Elements References {#element-refs}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spelling error: 'Elements References' should be 'Element References' (singular form is more appropriate for a heading about the concept).

StructuredTypeRef copy = builder.build(); // new reference is ready
```

Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarity improvement: The phrase 'Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent' is vague and unclear. Consider revising to: 'Ensure thorough testing when modifying references to avoid omitting filters or creating inconsistent reference states.'

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent.
Ensure thorough testing when modifying references to avoid omitting filters or creating inconsistent reference states.

Co-authored-by: René Jeglinsky <rene.jeglinsky@sap.com>
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced with AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4261 | Completion Tokens: 582

}
```

Below is an example how this can be used together to build an CQL statement:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar error: Missing article 'a' before 'CQL statement'. The sentence should read: 'Below is an example of how this can be used together to build a CQL statement:'


Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent.

References can be analyzed using the [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer) to bind it back to the model, for example, to find annotations or extract filter values. References an be introspected with [`CqnVisitor`](/java/working-with-cql/query-introspection#cqnvisitor).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spelling error: 'an be' should be 'can be'. The sentence should read: 'References can be introspected with CqnVisitor.'

The references are not comparable between each other. They cannot be used as map keys or set values.
:::

### Elements References {#element-refs}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar error: The heading should be 'Element References' (not 'Elements References') to maintain consistency with the singular form used elsewhere in the document.

CqnStructuredTypeRef ref = CQL.entity(Books_.class).filter(b -> b.ID().eq("...")).asRef(); // [!code focus]
```

To navigate to the author of the book, use `CQL.entity(...)` to make it typed again and add one more segment to it. Note, that this does not check that the original reference is indeed the reference to the book. This only lets you use required model interface.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarity improvement: The sentence 'Note, that this does not check that the original reference is indeed the reference to the book' contains an unnecessary comma after 'Note' and could be clearer. Consider: 'Note that this does not verify that the original reference actually points to a book.'


This new reference might be used as the root of its own statement to read or change the author.

To navigate to the parent, you can strip segment from the end of the ref.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarity improvement: The sentence 'To navigate to the parent, you can strip segment from the end of the ref' is missing an article. It should read: 'To navigate to the parent, you can strip a segment from the end of the ref.'

Co-authored-by: René Jeglinsky <rene.jeglinsky@sap.com>
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4261 | Completion Tokens: 623

Entity references specify entity sets. They can be used to define the target entity set of a [CQL](../../cds/cql) statement. They can either be defined inline using lambda expressions in the Query Builder (see [Target Entity Sets](#target-entity-sets)) or via the `CQL.entity` method, which is available in an _untyped_ version as well as in a _typed_ version that uses the generated [model interfaces](../cqn-services/persistence-services#model-interfaces). The following example shows an entity reference describing the set of *authors* that have published books in the year 2020:
Entity references specify entity sets and can define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.

A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change 'are not bound to the particular model and are not checked against it while they are being built' to 'The system does not bind references to a particular model and does not check them against it during construction.'

}
```

Below is an example how this can be used together to build an CQL statement:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity and conciseness. The sentence 'Below is an example how this can be used together to build an CQL statement:' has grammatical issues. Change to 'The following example shows how to use this to build a CQL statement:'


This new reference might be used as the root of its own statement to read or change the author.

To navigate to the parent, you can strip segment from the end of the ref.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change 'To navigate to the parent, you can strip segment from the end of the ref' to 'To navigate to the parent, strip the segment from the end of the reference.' Also, 'segment' should be 'a segment' for proper grammar.

StructuredTypeRef copy = builder.build(); // new reference is ready
```

Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity and fix grammar. Change 'Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent' to 'Test this code thoroughly to ensure you do not omit filters or make the reference inconsistent.'


### Elements References {#element-refs}

An element reference points to an element of the entity. Such references are usually _relative_, they do not have the name of the entity in their root. They can include filters in their segments except _in the last one_.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammar and improve clarity. Change 'Such references are usually relative, they do not have the name of the entity in their root' to 'Such references are usually relative; they do not include the entity name in their root.' Use a semicolon to properly connect the related clauses.

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These insights offer suggestions and observations that may help guide your development process. Please consider them as recommendations rather than definitive requirements. Your expertise and judgment remain the most important factors in making decisions about your code. The AI tools are simply here to provide additional perspective and support your work.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4255 | Completion Tokens: 640


A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.

References are either _absolute_ or _relative_. Absolute references always have the fully qualified name of the type in their first segment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change 'References are either absolute or relative' to 'References can be either absolute or relative' to make it more active and direct.

CqnElementRef dynamicTitle = CQL.get(Books.TITLE); // {"ref":["title"]}
```

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). For most of application code, the model interfaces are the recommended way to do this.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity by restructuring this sentence. Consider: 'New references are constructed using model interfaces or via the API that builds CQL statements. For most application code, model interfaces are the recommended approach.'

}
```

Below is an example how this can be used together to build a CQL statement:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammatical error. Change 'Below is an example how this can be used together' to 'Below is an example of how this can be used together' - the preposition 'of' is needed after 'example'.

CqnStructuredTypeRef ref = CQL.entity(Books_.class).filter(b -> b.ID().eq("...")).asRef(); // [!code focus]
```

To navigate to the author of the book, use `CQL.entity(...)` to make it typed again and add one more segment to it. Note, that this does not check that the original reference is indeed the reference to the book. This only lets you use required model interface.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve sentence structure for better clarity. Change 'Note, that this does not check that the original reference is indeed the reference to the book. This only lets you use required model interface.' to 'Note that this does not verify that the original reference points to the book. This only allows you to use the required model interface.' Also remove the comma after 'Note'.

CqnElementRef nameOfAuthor = CQL.entity(Books_.class).filter(f -> f.ID().eq("...")).author().name();
```

They also share the same features and limitations as the entity references and they cannot be used with [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change 'They also share the same features and limitations as the entity references and they cannot be used with' to 'Element references share the same features and limitations as entity references and cannot be used with' to avoid repetition and make it more concise.

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4223 | Completion Tokens: 584


A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.

References are either _absolute_ or _relative_. Absolute references always have the fully qualified name of the type in their first segment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change "References are either absolute or relative" to "References can be either absolute or relative" to make the sentence more direct and engaging.

CqnElementRef dynamicTitle = CQL.get(Books.TITLE); // {"ref":["title"]}
```

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). For most of application code, the model interfaces are the recommended way to do this.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity by restructuring this sentence. Consider: "For most application code, model interfaces are the recommended way to construct new references." This makes the recommendation clearer and more direct.

CqnStructuredTypeRef toAuthor = CQL.to(ref.segments()).to("author").asRef(); // [!code focus]
```

This new reference might be used as the root of its own statement to read or change the author.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change "This new reference might be used as the root of its own statement" to "You can use this new reference as the root of its own statement" to be more direct and actionable.


This new reference might be used as the root of its own statement to read or change the author.

To navigate to the parent, you can strip segment from the end of the ref.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve sentence structure for better readability. Change "To navigate to the parent, you can strip segment from the end of the ref" to "To navigate to the parent, you can strip a segment from the end of the reference." Note the addition of the article "a" and using "reference" instead of "ref" for consistency.

CqnElementRef nameOfAuthor = CQL.entity(Books_.class).filter(f -> f.ID().eq("...")).author().name();
```

Element references share the same features and limitations as entity references and cannot be used with [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change "Element references share the same features and limitations as entity references and cannot be used with" to "Element references have the same features and limitations as entity references and you cannot use them with" to make it more direct and clear.

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a collaborative code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and context. The AI analysis is here to support your decision-making process and provide additional perspective on your code.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4223 | Completion Tokens: 515


A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.

References are either _absolute_ or _relative_. Absolute references always have the fully qualified name of the type in their first segment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change "References are either absolute or relative" to "References can be either absolute or relative" to make the sentence more direct and engaging.

CqnElementRef dynamicTitle = CQL.get(Books.TITLE); // {"ref":["title"]}
```

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). For most of application code, the model interfaces are the recommended way to do this.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity by restructuring this sentence. Consider: "For most application code, model interfaces are the recommended way to construct new references." This makes the recommendation clearer and more direct.

CqnStructuredTypeRef toAuthor = CQL.to(ref.segments()).to("author").asRef(); // [!code focus]
```

This new reference might be used as the root of its own statement to read or change the author.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change "This new reference might be used" to "You can use this new reference" to be more direct and actionable.


This new reference might be used as the root of its own statement to read or change the author.

To navigate to the parent, you can strip segment from the end of the ref.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar error: Add an article. Change "strip segment from the end" to "strip a segment from the end" for proper grammar.

StructuredTypeRef copy = builder.build(); // new reference is ready
```

Test this code thoroughly and ensure that you do not omit the filters or change the reference so that it becomes inconsistent.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve sentence structure and clarity. Consider: "Test this code thoroughly and ensure that you do not omit filters or make the reference inconsistent." This removes redundancy and improves flow.

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These insights offer suggestions and observations that may help guide your development process. Please consider them as recommendations rather than definitive requirements. Your expertise and judgment remain the most important factors in making decisions about your code. The AI analysis is simply here to provide additional perspective and support your work.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4216 | Completion Tokens: 672


A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.

References are either _absolute_ or _relative_. Absolute references always have the fully qualified name of the type in their first segment.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change 'References are either absolute or relative' to 'References can be either absolute or relative' to make it more active and clear.

CqnElementRef dynamicTitle = CQL.get(Books.TITLE); // {"ref":["title"]}
```

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). For most of application code, the model interfaces are the recommended way to do this.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity by restructuring this sentence. Consider: 'New references are constructed using model interfaces or via the API that builds CQL statements. For most application code, model interfaces are the recommended approach.'

CqnStructuredTypeRef ref = CQL.entity(Books_.class).filter(b -> b.ID().eq("...")).chapters(c -> c.ID().eq("...")).pages(p -> p.ID().eq("...")).asRef();
```

References can be represented as JSON following an [Expression](../../cds/cxn) notation. The following is the JSON representation of the reference above:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change 'References can be represented as JSON following an Expression notation' to 'You can represent references as JSON using Expression notation.'

StructuredTypeRef copy = builder.build(); // new reference is ready
```

Test this code thoroughly and ensure that you do not omit filters or make the reference inconsistent.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and present tense. Change 'Test this code thoroughly and ensure that you do not omit filters or make the reference inconsistent' to 'Test this code thoroughly and ensure that you do not omit filters or create inconsistent references.'

CqnElementRef nameOfAuthor = CQL.entity(Books_.class).filter(f -> f.ID().eq("...")).author().name();
```

Element references share the same features and limitations as entity references and cannot be used with [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change 'Element references share the same features and limitations as entity references and cannot be used with CqnAnalyzer' to 'Element references have the same features and limitations as entity references. You cannot use them with CqnAnalyzer.'

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's specific needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 4214 | Completion Tokens: 622

Entity references specify entity sets. They can be used to define the target entity set of a [CQL](../../cds/cql) statement. They can either be defined inline using lambda expressions in the Query Builder (see [Target Entity Sets](#target-entity-sets)) or via the `CQL.entity` method, which is available in an _untyped_ version as well as in a _typed_ version that uses the generated [model interfaces](../cqn-services/persistence-services#model-interfaces). The following example shows an entity reference describing the set of *authors* that have published books in the year 2020:
Entity references specify entity sets and can define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.

A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change 'References are not bound to the particular model and are not checked against it while they are being built' to 'The system does not bind references to a particular model and does not check them against it during construction.'

CqnStructuredTypeRef ref = CQL.entity(Books_.class).filter(b -> b.ID().eq("...")).chapters(c -> c.ID().eq("...")).pages(p -> p.ID().eq("...")).asRef();
```

References have JSON representation that follows an [Expression](../../cds/cxn) notation. Below is the example if it:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix grammatical error. Change 'Below is the example if it:' to 'Below is an example of it:' - 'if' should be 'of'.

CqnStructuredTypeRef refToAuthor = CQL.entity(Books_.class, ref).author().asRef(); // [!code focus]
```

With `CQL.to(...)` the same is produced dynamically.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change 'With CQL.to(...) the same is produced dynamically' to 'Use CQL.to(...) to produce the same result dynamically.'

Comment on lines 1438 to 1439
An element reference points to an element of the entity. Such references are usually _relative_, they do not have the name of the entity in their root. They can include filters in their segments except _in the last one_.
Most of the time, they exist as members of the [select list](#projections) of a statement or part of the statement, for example, of an expand predicate.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change 'Such references are usually relative, they do not have the name of the entity in their root. They can include filters in their segments except in the last one' to 'Such references are usually relative and do not have the entity name in their root. You can include filters in their segments except in the last one.'

CqnElementRef nameOfAuthor = CQL.entity(Books_.class).filter(f -> f.ID().eq("...")).author().name();
```

Element references share the same features and limitations as entity references and cannot be used with [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change 'Element references share the same features and limitations as entity references and cannot be used with [CqnAnalyzer]' to 'Element references share the same features and limitations as entity references, and you cannot use them with [CqnAnalyzer]'.

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These insights offer suggestions and observations that may help guide your development process. Please consider them as recommendations rather than definitive requirements. Your expertise and judgment remain the most important factors in making decisions about your code. The AI analysis is simply here to provide additional perspective and support your work.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 3683 | Completion Tokens: 806

### Entity References {#entity-refs}

Entity references specify entity sets. They can be used to define the target entity set of a [CQL](../../cds/cql) statement. They can either be defined inline using lambda expressions in the Query Builder (see [Target Entity Sets](#target-entity-sets)) or via the `CQL.entity` method, which is available in an _untyped_ version as well as in a _typed_ version that uses the generated [model interfaces](../cqn-services/persistence-services#model-interfaces). The following example shows an entity reference describing the set of *authors* that have published books in the year 2020:
Entity references specify entity sets and can define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice instead of passive voice. Change "They can be used" to "You can use them" for better clarity and directness.

Suggested revision:

Entity references specify entity sets and you can use them to define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.

Entity references specify entity sets. They can be used to define the target entity set of a [CQL](../../cds/cql) statement. They can either be defined inline using lambda expressions in the Query Builder (see [Target Entity Sets](#target-entity-sets)) or via the `CQL.entity` method, which is available in an _untyped_ version as well as in a _typed_ version that uses the generated [model interfaces](../cqn-services/persistence-services#model-interfaces). The following example shows an entity reference describing the set of *authors* that have published books in the year 2020:
Entity references specify entity sets and can define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.

A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use present tense instead of future tense. The phrase "are not checked against it while they are being built" should be "are not checked against it during construction" to maintain present tense throughout.

Suggested revision:

The references are not bound to the particular model and are not checked against it during construction.


Relative references do not specify the type in the first segment and are [element references](/java/working-with-cql/query-api#element-refs) most of the time.

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). Prefer model interfaces in the application code.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use active voice and improve clarity. Change "New references are constructed" to "You construct new references" for better readability and active voice.

Suggested revision:

You construct new references with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). Prefer model interfaces in the application code.


### Element References {#element-refs}

An element reference points to regular element of the entity. Such references are usually _relative_ and form select list for a CQL statement or an expand.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve clarity and fix grammatical error. "An element reference points to regular element" should be "An element reference points to a regular element" (missing article). Also, consider rephrasing for better flow.

Suggested revision:

An element reference points to a regular element of the entity. Such references are usually _relative_ and form the select list for a CQL statement or an expand.

CqnElementRef nameOfAuthor = CQL.entity(Books_.class).filter(f -> f.ID().eq("...")).author().name();
```

Element references share the same features and limitations as entity references and cannot be used with [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Improve sentence structure and clarity. The sentence "Element references share the same features and limitations as entity references and cannot be used with [CqnAnalyzer]" could be clearer by separating the concepts.

Suggested revision:

Element references share the same features and limitations as entity references. However, you cannot use them with [`CqnAnalyzer`](/java/working-with-cql/query-introspection#cqnanalyzer).

Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a supportive code review enhanced by AI assistance. These suggestions offer potential improvements and insights to consider, though they're recommendations rather than requirements. You have full control over which feedback to implement based on your project's needs and goals. The AI analysis is here to complement your expertise and help streamline your development process.
Model: claude-sonnet-4-20250514 | Prompt Tokens: 3687 | Completion Tokens: 572

### Entity References {#entity-refs}

Entity references specify entity sets. They can be used to define the target entity set of a [CQL](../../cds/cql) statement. They can either be defined inline using lambda expressions in the Query Builder (see [Target Entity Sets](#target-entity-sets)) or via the `CQL.entity` method, which is available in an _untyped_ version as well as in a _typed_ version that uses the generated [model interfaces](../cqn-services/persistence-services#model-interfaces). The following example shows an entity reference describing the set of *authors* that have published books in the year 2020:
Entity references specify entity sets and can define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sentence structure is awkward and uses passive voice. Consider revising to:

"Entity references specify entity sets. You can use them to define the target entity set of a CQL statement or as arguments for event handlers."

Entity references specify entity sets. They can be used to define the target entity set of a [CQL](../../cds/cql) statement. They can either be defined inline using lambda expressions in the Query Builder (see [Target Entity Sets](#target-entity-sets)) or via the `CQL.entity` method, which is available in an _untyped_ version as well as in a _typed_ version that uses the generated [model interfaces](../cqn-services/persistence-services#model-interfaces). The following example shows an entity reference describing the set of *authors* that have published books in the year 2020:
Entity references specify entity sets and can define the target entity set of a [CQL](../../cds/cql) statement or serve as an argument for event handlers.

A reference consists of _segments_ that define the path from the entity's root to a certain part of it. Each segment has the _identifier_ with the name of the entity or an element and an optional filter _predicate_. These predicates might include other references. The references are not bound to the particular model and are not checked against it while they are being built.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence uses passive voice and is unclear. Consider revising to:

"The system does not bind references to a particular model and does not check them against it while building them."


Relative references do not specify the type in the first segment and are [element references](/java/working-with-cql/query-api#element-refs) most of the time.

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). Prefer model interfaces in the application code.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sentence structure is unclear and uses passive voice. Consider revising to:

"You construct new references with model interfaces or via the API that you also use to build CQL statements. Use model interfaces in application code."


### Element References {#element-refs}

An element reference points to a regular element of the entity. Such references are usually _relative_ and form select list for a CQL statement or an expand.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sentence uses passive voice. Consider revising to:

"Such references are usually relative and form the select list for a CQL statement or an expand."

CqnElementRef extendedRef = CQL.to(relativeRef.segments()).get("name"); // author/placeOfBirth/name
```

You can create _absolute_ element references, but they are rarely used.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sentence uses passive voice. Consider revising to:

"You rarely use absolute element references."

@renejeglinsky renejeglinsky removed the AI Review AI generated suggestions label Nov 6, 2025
Copy link
Contributor

@renejeglinsky renejeglinsky left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it's ok to simplify the links like that. Or have you had a certain reason not to do it?


The method `asRef()` seals the reference and makes it immutable.

Relative references do not specify the type in the first segment and are [element references](/java/working-with-cql/query-api#element-refs) most of the time.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Relative references do not specify the type in the first segment and are [element references](/java/working-with-cql/query-api#element-refs) most of the time.
Relative references do not specify the type in the first segment and are [element references](#element-refs) most of the time.


Relative references do not specify the type in the first segment and are [element references](/java/working-with-cql/query-api#element-refs) most of the time.

New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). Prefer model interfaces in the application code.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](/java/working-with-cql/query-api#concepts). Prefer model interfaces in the application code.
New references are constructed with [model interfaces](../cqn-services/persistence-services#model-interfaces) or via API that is also used to build [CQL statements](#concepts). Prefer model interfaces in the application code.

CqnElementRef relativeRef = statement.items().getFirst().asRef(); // author/placeOfBirth
```

Element references can be extended with the same APIs as the entity references.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Element references can be extended with the same APIs as the entity references.
Element references can be extended with the same APIs as the [entity references](#entity-refs).


// bookshop.Books[year = 2020].author // [!code focus]
Authors_ authors = CQL.entity(Books_.class).filter(b -> b.year().eq(2020)).author(); // [!code focus]
Given a simple reference pointing to the book created as follows.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Given a simple reference pointing to the book created as follows.
For the upcoming examples, let's assume a simple reference pointing to the book created as follows:

@vmikhailenko
Copy link
Contributor Author

Go ahead. I am also OK with textual changes.


You can also get [entity references](query-execution#entity-refs) from the result of a CDS QL statement to address an entity via its key values in other statements.

Each reference has ordered sequence of _segments_ that define the path from the entity's root to the certain part of it. Segment has the _identifier_ with the name of the entity or an element and optional filter _predicate_.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Each reference has ordered sequence of _segments_ that define the path from the entity's root to the certain part of it. Segment has the _identifier_ with the name of the entity or an element and optional filter _predicate_.
Each reference has ordered sequence of _segments_ that defines the path from the entity's root to the certain part of it. Segment has the _identifier_ with the name of the entity or an element and optional filter _predicate_.


Each reference has ordered sequence of _segments_ that define the path from the entity's root to the certain part of it. Segment has the _identifier_ with the name of the entity or an element and optional filter _predicate_.

Existing reference can be reused as an object or a variable, or a new reference can be built on top of it. References are not bound to the particular model and are not checked against it while they are being built.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Existing reference can be reused as an object or a variable, or a new reference can be built on top of it. References are not bound to the particular model and are not checked against it while they are being built.
An existing reference can be reused as an object or a variable, or a new reference can be built on top of it. References are not bound to the particular model and are not checked against it while they are being built.


Existing reference can be reused as an object or a variable, or a new reference can be built on top of it. References are not bound to the particular model and are not checked against it while they are being built.

References can be _absolute_ or _relative_. Absolute reference has fully qualified entity name as the identifier in the first segment. They usually have associations as their segments.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
References can be _absolute_ or _relative_. Absolute reference has fully qualified entity name as the identifier in the first segment. They usually have associations as their segments.
References can be _absolute_ or _relative_. An absolute reference has a fully qualified entity name as the identifier in the first segment. They usually have associations as their segments.


References can be _absolute_ or _relative_. Absolute reference has fully qualified entity name as the identifier in the first segment. They usually have associations as their segments.

You start with the reference pointing to a book with certain key. You build it using corresponding [model interfaces](../cqn-services/persistence-services#model-interfaces) providing you the methods that corresponds to the elements of the book.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
You start with the reference pointing to a book with certain key. You build it using corresponding [model interfaces](../cqn-services/persistence-services#model-interfaces) providing you the methods that corresponds to the elements of the book.
You start with the reference pointing to a book with a certain key. You build it using corresponding [model interfaces](../cqn-services/persistence-services#model-interfaces) providing you the methods that corresponds to the elements of the book.

refToAuthor.segments().subList(0, refToAuthor.segments().size() - 1)).asRef(); // Books(ID=...)
```

You can also construct ref that starts from the first segment to navigate to different path of the same root.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
You can also construct ref that starts from the first segment to navigate to different path of the same root.
You can also construct a ref that starts from the first segment to navigate to different path of the same root.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants