[ 
https://issues.apache.org/jira/browse/CAMEL-25361?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

shashank reassigned CAMEL-25361:
--------------------------------

    Assignee: shashank

> camel-couchbase - with useView=true and fullDocument=false the body is an 
> Optional, and fullDocument is documented as default false although it 
> defaults to true
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25361
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25361
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-couchbase
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Minor
>
> *The body of a view row is an {{Optional}}.* With {{useView=true}} and 
> {{fullDocument=false}} the consumer sets the body to 
> {{row.valueAs(Object.class)}}. In the Couchbase Java SDK 3 
> {{ViewRow.valueAs}} returns {{Optional<T>}}, so the body is 
> {{Optional[value]}} instead of the value the view emitted, and 
> {{Optional.empty}} when the view emitted {{null}} (for example 
> {{emit(doc._id, null)}}). The call dates from the option itself (CAMEL-15792, 
> 3.7, the SDK 3 migration); no test or IT covered {{fullDocument=false}} with 
> a view. The SQL++ path ({{useView=false}}, the default since CAMEL-23218) is 
> not affected: it uses {{row.toString()}}, the row as a JSON string.
> *The default of {{fullDocument}} is documented wrongly.* The field is 
> {{private boolean fullDocument = true}}, but its {{@UriParam}} says 
> {{defaultValue = "false"}}, so the component JSON, the catalog, the endpoint 
> DSL javadoc ("Default: false") and the option table on the component page all 
> say false. Both date from CAMEL-15792 (commit e4c4d0e101f9). True is the 
> intended and actual default: before that commit the consumer always fetched 
> the document, so true keeps that behaviour, and the SQL++ section of the 
> component page already says "When {{fullDocument}} is {{true}} (the 
> default)". A user or tool that relies on the documented default and leaves 
> the option out gets the full document.
> h3. Reproduction
> New {{CouchbaseConsumerBodyTest}} (mocked cluster, the test calls {{poll()}}):
> * {{theValueEmittedByTheViewIsTheBodyWithoutFullDocument}}: on main 
> {{expected: <[{name=Alice}, Bob]> but was: <[Optional[{name=Alice}], 
> Optional[Bob]]>}};
> * {{theBodyIsNullWhenTheViewEmitsNoValue}}: on main {{expected: <null> but 
> was: <Optional.empty>}};
> * controls, pass on main: {{theQueryRowIsTheBodyWithoutFullDocument}} (SQL++ 
> row as JSON string) and {{theFullDocumentIsTheBodyByDefault}} (without the 
> option the consumer fetches the document).
> The two view tests fail in two runs on main.
> h3. Proposed fix
> * {{row.valueAs(Object.class).orElse(null)}}: the body is the value the view 
> emitted, or {{null}} when it emitted none (an empty message, as for any 
> consumer without content).
> * {{@UriParam(defaultValue = "true")}} on {{fullDocument}}; component JSON, 
> catalog JSON and endpoint DSL regenerated. No runtime change.
> * Upgrade guide 4.23, under {{=== camel-couchbase}}: the body change for 
> views with {{fullDocument=false}}; and under the existing {{==== 
> consumerProcessedStrategy=delete}} the line asked for in the review of 
> #27347: a view or SQL++ query that returns several rows for one document now 
> delivers only the first of these rows with {{delete}} (checked against the 
> code: the first row marks the document in progress, the other rows are 
> skipped, and the completed exchange removes the document; in 4.22 the next 
> row of the already removed document failed the whole poll).
> Module: 61 tests pass.
> In the same review Claus also suggested clearing the set of documents in 
> progress in {{doStop}}/{{doStart}}, as the set would survive 
> {{stopRoute}}/{{startRoute}}. That turned out unnecessary: a route restart 
> creates a new consumer ({{RouteService}} sets the route up again and 
> {{DefaultRoute.initializeServices}} calls {{endpoint.createConsumer}}), so 
> the set starts empty after a route restart. It is not part of this change.
> Affected: the {{Optional}} body and the documented default in 4.14.x, 4.18.x 
> and main. The body fix changes what routes receive, so it is proposed for 
> main with the upgrade note; the upgrade-guide line on several rows applies 
> only to 4.23 (CAMEL-25221).
> Duplicate check (2026-10-05): JIRA "fullDocument" (only a camel-mongodb 
> issue), "valueAs" (none), component camel-couchbase with "Optional" (none 
> relevant), open camel-couchbase issues (CAMEL-23625, CAMEL-23626, integration 
> tests and examples). GitHub pull requests "couchbase fullDocument", 
> "couchbase Optional", "couchbase valueAs": none.
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to