This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch CAMEL-23218 in repository https://gitbox.apache.org/repos/asf/camel.git
commit c3bf789d29dc2479398699782e06935464d732aa Author: Guillaume Nodet <[email protected]> AuthorDate: Thu Mar 19 16:54:50 2026 +0100 CAMEL-23218: camel-couchbase - Add SQL++ consumer support with useView toggle Co-Authored-By: Claude Opus 4.6 <[email protected]> --- .../apache/camel/catalog/components/couchbase.json | 67 +++++++++---------- .../couchbase/CouchbaseEndpointConfigurer.java | 6 ++ .../couchbase/CouchbaseEndpointUriFactory.java | 3 +- .../camel/component/couchbase/couchbase.json | 67 +++++++++---------- .../src/main/docs/couchbase-component.adoc | 76 +++++++++++++++------- .../component/couchbase/CouchbaseConsumer.java | 20 +++++- .../component/couchbase/CouchbaseEndpoint.java | 74 +++++++++++++++++++-- .../component/couchbase/CouchbaseEndpointTest.java | 76 ++++++++++++++++++++++ .../couchbase/integration/ConsumeSqlQueryIT.java | 31 +++++++-- .../ROOT/pages/camel-4x-upgrade-guide-4_19.adoc | 9 ++- .../dsl/CouchbaseComponentBuilderFactory.java | 9 +-- .../dsl/CouchbaseEndpointBuilderFactory.java | 38 ++++++++++- 12 files changed, 362 insertions(+), 114 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json index af5a9324d4a2..09f621e665fd 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/couchbase.json @@ -56,38 +56,39 @@ "rangeStartKey": { "index": 14, "kind": "parameter", "displayName": "Range Start Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Define a range for the start key" }, "sendEmptyMessageWhenIdle": { "index": 15, "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." }, "skip": { "index": 16, "kind": "parameter", "displayName": "Skip", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "description": "Define the skip to use" }, - "statement": { "index": 17, "kind": "parameter", "displayName": "Statement", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "A SQL (N1QL) query statement for consuming documents. When set, the consumer uses SQL queries instead of MapReduce views. The query should select META().id AS __id to identify documents. Example: SELECT META().id AS __id, FROM [...] - "viewName": { "index": 18, "kind": "parameter", "displayName": "View Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "defaultValue": "brewery_beers", "description": "The view name to use. Deprecated: use the statement option with SQL queries instead." }, - "bridgeErrorHandler": { "index": 19, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming [...] - "exceptionHandler": { "index": 20, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...] - "exchangePattern": { "index": 21, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, - "pollStrategy": { "index": 22, "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the po [...] - "autoStartIdForInserts": { "index": 23, "kind": "parameter", "displayName": "Auto Start Id For Inserts", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Define if we want an autostart Id when we are doing an insert operation" }, - "operation": { "index": 24, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CCB_PUT", "description": "The operation to do" }, - "persistTo": { "index": 25, "kind": "parameter", "displayName": "Persist To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to persist the data" }, - "producerRetryAttempts": { "index": 26, "kind": "parameter", "displayName": "Producer Retry Attempts", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Define the number of retry attempts" }, - "producerRetryPause": { "index": 27, "kind": "parameter", "displayName": "Producer Retry Pause", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, "description": "Define the producer retry pause between different attempts" }, - "replicateTo": { "index": 28, "kind": "parameter", "displayName": "Replicate To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to replicate the data" }, - "startingIdForInsertsFrom": { "index": 29, "kind": "parameter", "displayName": "Starting Id For Inserts From", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Define the starting Id where we are doing an insert operation" }, - "lazyStartProducer": { "index": 30, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] - "additionalHosts": { "index": 31, "kind": "parameter", "displayName": "Additional Hosts", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The additional hosts" }, - "connectTimeout": { "index": 32, "kind": "parameter", "displayName": "Connect Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "30000", "description": "Define the timeoutconnect in milliseconds" }, - "queryTimeout": { "index": 33, "kind": "parameter", "displayName": "Query Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the operation timeout in milliseconds" }, - "backoffErrorThreshold": { "index": 34, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, - "backoffIdleThreshold": { "index": 35, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, - "backoffMultiplier": { "index": 36, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] - "delay": { "index": 37, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, - "greedy": { "index": 38, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, - "initialDelay": { "index": 39, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, - "repeatCount": { "index": 40, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, - "runLoggingLevel": { "index": 41, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the log [...] - "scheduledExecutorService": { "index": 42, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, - "scheduler": { "index": 43, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, - "schedulerProperties": { "index": 44, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. This i [...] - "startScheduler": { "index": 45, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, - "timeUnit": { "index": 46, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, - "useFixedDelay": { "index": 47, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, - "password": { "index": 48, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The password to use" }, - "username": { "index": 49, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The username to use" } + "statement": { "index": 17, "kind": "parameter", "displayName": "Statement", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "A SQL (N1QL) query statement for consuming documents. When set, the consumer uses SQL queries instead of MapReduce views. The query should select META().id AS __id to identify documents. Example: SELECT META().id AS __id, FROM [...] + "useView": { "index": 18, "kind": "parameter", "displayName": "Use View", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If true, use the deprecated MapReduce Views to query documents via designDocumentName and viewName. If false (default), use SQL queries instead." }, + "viewName": { "index": 19, "kind": "parameter", "displayName": "View Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "defaultValue": "brewery_beers", "description": "The view name to use. Deprecated: use the statement option with SQL queries instead." }, + "bridgeErrorHandler": { "index": 20, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming [...] + "exceptionHandler": { "index": 21, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...] + "exchangePattern": { "index": 22, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, + "pollStrategy": { "index": 23, "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the po [...] + "autoStartIdForInserts": { "index": 24, "kind": "parameter", "displayName": "Auto Start Id For Inserts", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Define if we want an autostart Id when we are doing an insert operation" }, + "operation": { "index": 25, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CCB_PUT", "description": "The operation to do" }, + "persistTo": { "index": 26, "kind": "parameter", "displayName": "Persist To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to persist the data" }, + "producerRetryAttempts": { "index": 27, "kind": "parameter", "displayName": "Producer Retry Attempts", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Define the number of retry attempts" }, + "producerRetryPause": { "index": 28, "kind": "parameter", "displayName": "Producer Retry Pause", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, "description": "Define the producer retry pause between different attempts" }, + "replicateTo": { "index": 29, "kind": "parameter", "displayName": "Replicate To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to replicate the data" }, + "startingIdForInsertsFrom": { "index": 30, "kind": "parameter", "displayName": "Starting Id For Inserts From", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Define the starting Id where we are doing an insert operation" }, + "lazyStartProducer": { "index": 31, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] + "additionalHosts": { "index": 32, "kind": "parameter", "displayName": "Additional Hosts", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The additional hosts" }, + "connectTimeout": { "index": 33, "kind": "parameter", "displayName": "Connect Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "30000", "description": "Define the timeoutconnect in milliseconds" }, + "queryTimeout": { "index": 34, "kind": "parameter", "displayName": "Query Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the operation timeout in milliseconds" }, + "backoffErrorThreshold": { "index": 35, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, + "backoffIdleThreshold": { "index": 36, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, + "backoffMultiplier": { "index": 37, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] + "delay": { "index": 38, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, + "greedy": { "index": 39, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, + "initialDelay": { "index": 40, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, + "repeatCount": { "index": 41, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, + "runLoggingLevel": { "index": 42, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the log [...] + "scheduledExecutorService": { "index": 43, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, + "scheduler": { "index": 44, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, + "schedulerProperties": { "index": 45, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. This i [...] + "startScheduler": { "index": 46, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, + "timeUnit": { "index": 47, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, + "useFixedDelay": { "index": 48, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, + "password": { "index": 49, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The password to use" }, + "username": { "index": 50, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The username to use" } } } diff --git a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java index a42ba78da7fd..193f721fa385 100644 --- a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java +++ b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointConfigurer.java @@ -100,6 +100,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "timeUnit": target.setTimeUnit(property(camelContext, java.util.concurrent.TimeUnit.class, value)); return true; case "usefixeddelay": case "useFixedDelay": target.setUseFixedDelay(property(camelContext, boolean.class, value)); return true; + case "useview": + case "useView": target.setUseView(property(camelContext, boolean.class, value)); return true; case "username": target.setUsername(property(camelContext, java.lang.String.class, value)); return true; case "viewname": case "viewName": target.setViewName(property(camelContext, java.lang.String.class, value)); return true; @@ -187,6 +189,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "timeUnit": return java.util.concurrent.TimeUnit.class; case "usefixeddelay": case "useFixedDelay": return boolean.class; + case "useview": + case "useView": return boolean.class; case "username": return java.lang.String.class; case "viewname": case "viewName": return java.lang.String.class; @@ -275,6 +279,8 @@ public class CouchbaseEndpointConfigurer extends PropertyConfigurerSupport imple case "timeUnit": return target.getTimeUnit(); case "usefixeddelay": case "useFixedDelay": return target.isUseFixedDelay(); + case "useview": + case "useView": return target.isUseView(); case "username": return target.getUsername(); case "viewname": case "viewName": return target.getViewName(); diff --git a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java index 4a62315f7a35..a6fd42ec6e89 100644 --- a/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java +++ b/components/camel-couchbase/src/generated/java/org/apache/camel/component/couchbase/CouchbaseEndpointUriFactory.java @@ -23,7 +23,7 @@ public class CouchbaseEndpointUriFactory extends org.apache.camel.support.compon private static final Set<String> SECRET_PROPERTY_NAMES; private static final Map<String, String> MULTI_VALUE_PREFIXES; static { - Set<String> props = new HashSet<>(50); + Set<String> props = new HashSet<>(51); props.add("additionalHosts"); props.add("autoStartIdForInserts"); props.add("backoffErrorThreshold"); @@ -72,6 +72,7 @@ public class CouchbaseEndpointUriFactory extends org.apache.camel.support.compon props.add("statement"); props.add("timeUnit"); props.add("useFixedDelay"); + props.add("useView"); props.add("username"); props.add("viewName"); PROPERTY_NAMES = Collections.unmodifiableSet(props); diff --git a/components/camel-couchbase/src/generated/resources/META-INF/org/apache/camel/component/couchbase/couchbase.json b/components/camel-couchbase/src/generated/resources/META-INF/org/apache/camel/component/couchbase/couchbase.json index af5a9324d4a2..09f621e665fd 100644 --- a/components/camel-couchbase/src/generated/resources/META-INF/org/apache/camel/component/couchbase/couchbase.json +++ b/components/camel-couchbase/src/generated/resources/META-INF/org/apache/camel/component/couchbase/couchbase.json @@ -56,38 +56,39 @@ "rangeStartKey": { "index": 14, "kind": "parameter", "displayName": "Range Start Key", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Define a range for the start key" }, "sendEmptyMessageWhenIdle": { "index": 15, "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." }, "skip": { "index": 16, "kind": "parameter", "displayName": "Skip", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "description": "Define the skip to use" }, - "statement": { "index": 17, "kind": "parameter", "displayName": "Statement", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "A SQL (N1QL) query statement for consuming documents. When set, the consumer uses SQL queries instead of MapReduce views. The query should select META().id AS __id to identify documents. Example: SELECT META().id AS __id, FROM [...] - "viewName": { "index": 18, "kind": "parameter", "displayName": "View Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "defaultValue": "brewery_beers", "description": "The view name to use. Deprecated: use the statement option with SQL queries instead." }, - "bridgeErrorHandler": { "index": 19, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming [...] - "exceptionHandler": { "index": 20, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...] - "exchangePattern": { "index": 21, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, - "pollStrategy": { "index": 22, "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the po [...] - "autoStartIdForInserts": { "index": 23, "kind": "parameter", "displayName": "Auto Start Id For Inserts", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Define if we want an autostart Id when we are doing an insert operation" }, - "operation": { "index": 24, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CCB_PUT", "description": "The operation to do" }, - "persistTo": { "index": 25, "kind": "parameter", "displayName": "Persist To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to persist the data" }, - "producerRetryAttempts": { "index": 26, "kind": "parameter", "displayName": "Producer Retry Attempts", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Define the number of retry attempts" }, - "producerRetryPause": { "index": 27, "kind": "parameter", "displayName": "Producer Retry Pause", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, "description": "Define the producer retry pause between different attempts" }, - "replicateTo": { "index": 28, "kind": "parameter", "displayName": "Replicate To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to replicate the data" }, - "startingIdForInsertsFrom": { "index": 29, "kind": "parameter", "displayName": "Starting Id For Inserts From", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Define the starting Id where we are doing an insert operation" }, - "lazyStartProducer": { "index": 30, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] - "additionalHosts": { "index": 31, "kind": "parameter", "displayName": "Additional Hosts", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The additional hosts" }, - "connectTimeout": { "index": 32, "kind": "parameter", "displayName": "Connect Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "30000", "description": "Define the timeoutconnect in milliseconds" }, - "queryTimeout": { "index": 33, "kind": "parameter", "displayName": "Query Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the operation timeout in milliseconds" }, - "backoffErrorThreshold": { "index": 34, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, - "backoffIdleThreshold": { "index": 35, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, - "backoffMultiplier": { "index": 36, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] - "delay": { "index": 37, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, - "greedy": { "index": 38, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, - "initialDelay": { "index": 39, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, - "repeatCount": { "index": 40, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, - "runLoggingLevel": { "index": 41, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the log [...] - "scheduledExecutorService": { "index": 42, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, - "scheduler": { "index": 43, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, - "schedulerProperties": { "index": 44, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. This i [...] - "startScheduler": { "index": 45, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, - "timeUnit": { "index": 46, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, - "useFixedDelay": { "index": 47, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, - "password": { "index": 48, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The password to use" }, - "username": { "index": 49, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The username to use" } + "statement": { "index": 17, "kind": "parameter", "displayName": "Statement", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "A SQL (N1QL) query statement for consuming documents. When set, the consumer uses SQL queries instead of MapReduce views. The query should select META().id AS __id to identify documents. Example: SELECT META().id AS __id, FROM [...] + "useView": { "index": 18, "kind": "parameter", "displayName": "Use View", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If true, use the deprecated MapReduce Views to query documents via designDocumentName and viewName. If false (default), use SQL queries instead." }, + "viewName": { "index": 19, "kind": "parameter", "displayName": "View Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "defaultValue": "brewery_beers", "description": "The view name to use. Deprecated: use the statement option with SQL queries instead." }, + "bridgeErrorHandler": { "index": 20, "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming [...] + "exceptionHandler": { "index": 21, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...] + "exchangePattern": { "index": 22, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, + "pollStrategy": { "index": 23, "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the po [...] + "autoStartIdForInserts": { "index": 24, "kind": "parameter", "displayName": "Auto Start Id For Inserts", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Define if we want an autostart Id when we are doing an insert operation" }, + "operation": { "index": 25, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CCB_PUT", "description": "The operation to do" }, + "persistTo": { "index": 26, "kind": "parameter", "displayName": "Persist To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to persist the data" }, + "producerRetryAttempts": { "index": 27, "kind": "parameter", "displayName": "Producer Retry Attempts", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Define the number of retry attempts" }, + "producerRetryPause": { "index": 28, "kind": "parameter", "displayName": "Producer Retry Pause", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, "description": "Define the producer retry pause between different attempts" }, + "replicateTo": { "index": 29, "kind": "parameter", "displayName": "Replicate To", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Where to replicate the data" }, + "startingIdForInsertsFrom": { "index": 30, "kind": "parameter", "displayName": "Starting Id For Inserts From", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Define the starting Id where we are doing an insert operation" }, + "lazyStartProducer": { "index": 31, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] + "additionalHosts": { "index": 32, "kind": "parameter", "displayName": "Additional Hosts", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The additional hosts" }, + "connectTimeout": { "index": 33, "kind": "parameter", "displayName": "Connect Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "30000", "description": "Define the timeoutconnect in milliseconds" }, + "queryTimeout": { "index": 34, "kind": "parameter", "displayName": "Query Timeout", "group": "advanced", "label": "advanced", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2500", "description": "Define the operation timeout in milliseconds" }, + "backoffErrorThreshold": { "index": 35, "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." }, + "backoffIdleThreshold": { "index": 36, "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." }, + "backoffMultiplier": { "index": 37, "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is h [...] + "delay": { "index": 38, "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 500, "description": "Milliseconds before the next poll." }, + "greedy": { "index": 39, "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." }, + "initialDelay": { "index": 40, "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "Milliseconds before the first poll starts." }, + "repeatCount": { "index": 41, "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 0, "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." }, + "runLoggingLevel": { "index": 42, "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the log [...] + "scheduledExecutorService": { "index": 43, "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." }, + "scheduler": { "index": 44, "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.lang.Object", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler" }, + "schedulerProperties": { "index": 45, "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. This i [...] + "startScheduler": { "index": 46, "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the scheduler should be auto started." }, + "timeUnit": { "index": 47, "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "enum", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." }, + "useFixedDelay": { "index": 48, "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." }, + "password": { "index": 49, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The password to use" }, + "username": { "index": 50, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "The username to use" } } } diff --git a/components/camel-couchbase/src/main/docs/couchbase-component.adoc b/components/camel-couchbase/src/main/docs/couchbase-component.adoc index ea909aab8339..5551f7bf43a1 100644 --- a/components/camel-couchbase/src/main/docs/couchbase-component.adoc +++ b/components/camel-couchbase/src/main/docs/couchbase-component.adoc @@ -48,22 +48,43 @@ include::partial$component-endpoint-headers.adoc[] The consumer supports two query modes for polling documents from Couchbase: -=== SQL++ queries (recommended) +=== SQL++ queries (recommended, default) Since Couchbase Server 7.0, the recommended way to query documents is using SQL++ (formerly N1QL). MapReduce Views are deprecated since Couchbase 7.0 and do not work with the Magma storage backend (default since Couchbase 8.0). -To use SQL++ queries, set the `statement` endpoint option: +By default, the consumer uses SQL++ queries. You can either provide an explicit `statement` or +let the consumer auto-generate one from the endpoint options. + +==== Auto-generated queries + +The simplest way to consume documents is to just use the existing endpoint options. The consumer +auto-generates a SQL++ query from `bucket`, `collection`, `limit`, `skip`, `descending`, +`rangeStartKey`, and `rangeEndKey`: + +[source,java] +---- +// Consumes up to 10 documents in descending order +from("couchbase:http://localhost?bucket=myBucket&username=user&password=pass&limit=10&descending=true") + .to("direct:result"); +---- + +This generates: `SELECT META().id AS \__id, * FROM \`myBucket\` ORDER BY META().id DESC LIMIT 10` + +==== Explicit SQL++ statements + +For complex queries (filters, joins, aggregations), set the `statement` option directly: [source,java] ---- from("couchbase:http://localhost?bucket=myBucket&username=user&password=pass" - + "&statement=SELECT META().id AS __id, * FROM `myCollection` LIMIT 100") + + "&statement=SELECT META().id AS __id, * FROM `myCollection` WHERE type = 'order' LIMIT 100") .to("direct:result"); ---- The query must include `META().id AS \__id` in the SELECT clause so the consumer can identify each document. + When `fullDocument` is `true` (the default), the consumer fetches the complete document from the KV store using the document ID. When `false`, the query result row is used directly as the message body. @@ -72,58 +93,63 @@ Create one with: `CREATE PRIMARY INDEX ON \`myBucket\`` or via the Couchbase SDK === MapReduce Views (deprecated) -The consumer can also poll documents using MapReduce Views via the `designDocumentName` and `viewName` -endpoint options. This mode is deprecated and will be removed in a future release. +The consumer can also poll documents using MapReduce Views by setting `useView=true` with the +`designDocumentName` and `viewName` endpoint options. This mode is deprecated and will be removed +in a future release. [source,java] ---- from("couchbase:http://localhost?bucket=myBucket&username=user&password=pass" - + "&designDocumentName=myDoc&viewName=myView&limit=10") + + "&useView=true&designDocumentName=myDoc&viewName=myView&limit=10") .to("direct:result"); ---- === Migrating from Views to SQL++ -The following table shows how to migrate from MapReduce View options to equivalent SQL++ queries: +To migrate from MapReduce Views to SQL++, simply remove `designDocumentName` and `viewName` from +your endpoint URI. The `limit`, `skip`, `descending`, `rangeStartKey`, and `rangeEndKey` options +are automatically translated to SQL++ clauses: -[cols="1,1,2",options="header"] +[cols="1,1",options="header"] |=== -| View option | SQL++ equivalent | Example +| View option | SQL++ equivalent | `designDocumentName` + `viewName` -| `statement` -| The view's map function determines what is emitted. Write an equivalent SQL++ query with a `WHERE` clause. +| Removed (or replaced by `statement` for custom queries) | `limit=10` -| `LIMIT 10` in the query -| `SELECT META().id AS \__id, * FROM \`bucket\` LIMIT 10` +| `LIMIT 10` | `skip=5` -| `OFFSET 5` in the query -| `SELECT META().id AS \__id, * FROM \`bucket\` LIMIT 10 OFFSET 5` +| `OFFSET 5` | `descending=true` -| `ORDER BY ... DESC` in the query -| `SELECT META().id AS \__id, * FROM \`bucket\` ORDER BY META().id DESC` +| `ORDER BY META().id DESC` -| `rangeStartKey` / `rangeEndKey` -| `WHERE` clause in the query -| `SELECT META().id AS \__id, * FROM \`bucket\` WHERE META().id >= 'start' AND META().id \<= 'end'` +| `rangeStartKey=A` / `rangeEndKey=Z` +| `WHERE META().id >= 'A' AND META().id \<= 'Z'` | `fullDocument=true` -| Works the same way -| When `true`, the consumer fetches the full document via KV get regardless of query mode. +| Works the same way in both modes |=== -For example, a view-based consumer like: +For example, a view-based consumer: + +[source,java] +---- +from("couchbase:http://localhost?bucket=myBucket&username=user&password=pass" + + "&useView=true&designDocumentName=myDoc&viewName=myView&limit=10&descending=true") +---- + +Can be migrated by simply removing the view-specific options: [source,java] ---- from("couchbase:http://localhost?bucket=myBucket&username=user&password=pass" - + "&designDocumentName=myDoc&viewName=myView&limit=10&descending=true") + + "&limit=10&descending=true") ---- -Can be migrated to: +Or with an explicit SQL++ statement for more control: [source,java] ---- diff --git a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java index 757c9c02e7f9..d7068391d38a 100644 --- a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java +++ b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseConsumer.java @@ -60,6 +60,8 @@ public class CouchbaseConsumer extends ScheduledBatchPollingConsumer implements private Scope scope; private Collection collection; private ViewOptions viewOptions; + private boolean useSqlQuery; + private String sqlStatement; private ResumeStrategy resumeStrategy; @@ -85,7 +87,19 @@ public class CouchbaseConsumer extends ScheduledBatchPollingConsumer implements this.collection = bucket.defaultCollection(); } - if (endpoint.getStatement() == null) { + // Determine query mode + if (endpoint.getStatement() != null) { + // Explicit SQL++ statement provided + useSqlQuery = true; + sqlStatement = endpoint.getStatement(); + } else if (!endpoint.isUseView()) { + // Auto-generate SQL++ from endpoint options + useSqlQuery = true; + sqlStatement = endpoint.buildSqlQuery(); + LOG.info("Auto-generated SQL++ query: {}", sqlStatement); + } else { + // Use deprecated MapReduce views + useSqlQuery = false; initViewOptions(); } } @@ -133,7 +147,7 @@ public class CouchbaseConsumer extends ScheduledBatchPollingConsumer implements protected int poll() throws Exception { lock.lock(); try { - if (endpoint.getStatement() != null) { + if (useSqlQuery) { return pollWithSqlQuery(); } else { return pollWithView(); @@ -147,7 +161,7 @@ public class CouchbaseConsumer extends ScheduledBatchPollingConsumer implements QueryOptions queryOptions = QueryOptions.queryOptions() .scanConsistency(QueryScanConsistency.REQUEST_PLUS); - QueryResult result = scope.query(endpoint.getStatement(), queryOptions); + QueryResult result = scope.query(sqlStatement, queryOptions); forceConsumerAsReady(); diff --git a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java index 056ab904f2e8..93d7624efb64 100644 --- a/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java +++ b/components/camel-couchbase/src/main/java/org/apache/camel/component/couchbase/CouchbaseEndpoint.java @@ -117,11 +117,11 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint implements Endpoint private long startingIdForInsertsFrom; // SQL++ query - @UriParam(label = "consumer", - description = "A SQL++ (N1QL) query statement for consuming documents." - + " When set, the consumer uses SQL++ queries instead of MapReduce views." - + " The query should select META().id AS __id to identify documents." - + " Example: SELECT META().id AS __id, * FROM `myCollection` WHERE type = 'order' LIMIT 100") + @UriParam(label = "consumer", defaultValue = "false", + description = "If true, use the deprecated MapReduce Views to query documents via designDocumentName and viewName." + + " If false (default), use SQL++ queries instead.") + private boolean useView; + @UriParam(label = "consumer") private String statement; // View control @@ -420,12 +420,74 @@ public class CouchbaseEndpoint extends ScheduledPollEndpoint implements Endpoint /** * A SQL++ (N1QL) query statement for consuming documents. When set, the consumer uses SQL++ queries instead of * MapReduce views. The query should select META().id AS __id to identify documents. Example: SELECT META().id AS - * __id, * FROM `myCollection` WHERE type = 'order' LIMIT 100 + * __id, * FROM `myCollection` WHERE type = 'order' LIMIT 100. If not set and useView is false, a SQL++ query is + * auto-generated from the bucket, scope, collection, limit, skip, descending, rangeStartKey, and rangeEndKey + * options. */ public void setStatement(String statement) { this.statement = statement; } + public boolean isUseView() { + return useView; + } + + /** + * If true, use the deprecated MapReduce Views to query documents via designDocumentName and viewName. If false + * (default), use SQL++ queries instead. When both useView is false and statement is not set, a SQL++ query is + * auto-generated from the endpoint options (limit, skip, descending, etc.). + */ + public void setUseView(boolean useView) { + this.useView = useView; + } + + /** + * Builds a SQL++ query from the endpoint options. + */ + String buildSqlQuery() { + StringBuilder sb = new StringBuilder("SELECT META().id AS __id, * FROM `"); + // Use the collection if set, otherwise use the bucket name (default collection) + if (collection != null && !collection.isEmpty()) { + sb.append(collection); + } else { + sb.append(bucket); + } + sb.append('`'); + + // WHERE clause from range keys + String startKey = rangeStartKey; + String endKey = rangeEndKey; + boolean hasStart = startKey != null && !startKey.isEmpty(); + boolean hasEnd = endKey != null && !endKey.isEmpty(); + if (hasStart || hasEnd) { + sb.append(" WHERE "); + if (hasStart && hasEnd) { + sb.append("META().id >= '").append(startKey).append("' AND META().id <= '").append(endKey).append('\''); + } else if (hasStart) { + sb.append("META().id >= '").append(startKey).append('\''); + } else { + sb.append("META().id <= '").append(endKey).append('\''); + } + } + + // ORDER BY + if (descending) { + sb.append(" ORDER BY META().id DESC"); + } + + // LIMIT + if (limit > 0) { + sb.append(" LIMIT ").append(limit); + } + + // OFFSET + if (skip > 0) { + sb.append(" OFFSET ").append(skip); + } + + return sb.toString(); + } + /** * @deprecated Use {@link #setStatement(String)} with SQL++ queries instead. */ diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java index c614e6c3726d..6d6f6ee8fd62 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/CouchbaseEndpointTest.java @@ -173,6 +173,82 @@ public class CouchbaseEndpointTest { endpoint.setDescending(false); } + @Test + public void testBuildSqlQuerySimple() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + String query = endpoint.buildSqlQuery(); + assertEquals("SELECT META().id AS __id, * FROM `myBucket`", query); + } + + @Test + public void testBuildSqlQueryWithCollection() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + endpoint.setCollection("myCollection"); + String query = endpoint.buildSqlQuery(); + assertEquals("SELECT META().id AS __id, * FROM `myCollection`", query); + } + + @Test + public void testBuildSqlQueryWithLimitAndSkip() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + endpoint.setLimit(10); + endpoint.setSkip(5); + String query = endpoint.buildSqlQuery(); + assertEquals("SELECT META().id AS __id, * FROM `myBucket` LIMIT 10 OFFSET 5", query); + } + + @Test + public void testBuildSqlQueryWithDescending() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + endpoint.setDescending(true); + endpoint.setLimit(10); + String query = endpoint.buildSqlQuery(); + assertEquals("SELECT META().id AS __id, * FROM `myBucket` ORDER BY META().id DESC LIMIT 10", query); + } + + @Test + public void testBuildSqlQueryWithRangeKeys() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + endpoint.setRangeStartKey("docA"); + endpoint.setRangeEndKey("docZ"); + String query = endpoint.buildSqlQuery(); + assertEquals( + "SELECT META().id AS __id, * FROM `myBucket` WHERE META().id >= 'docA' AND META().id <= 'docZ'", + query); + } + + @Test + public void testBuildSqlQueryWithStartKeyOnly() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + endpoint.setRangeStartKey("docA"); + String query = endpoint.buildSqlQuery(); + assertEquals("SELECT META().id AS __id, * FROM `myBucket` WHERE META().id >= 'docA'", query); + } + + @Test + public void testBuildSqlQueryFullOptions() { + CouchbaseEndpoint endpoint = new CouchbaseEndpoint(); + endpoint.setBucket("myBucket"); + endpoint.setCollection("orders"); + endpoint.setRangeStartKey("order_001"); + endpoint.setRangeEndKey("order_999"); + endpoint.setDescending(true); + endpoint.setLimit(50); + endpoint.setSkip(10); + String query = endpoint.buildSqlQuery(); + assertEquals( + "SELECT META().id AS __id, * FROM `orders`" + + " WHERE META().id >= 'order_001' AND META().id <= 'order_999'" + + " ORDER BY META().id DESC LIMIT 50 OFFSET 10", + query); + } + /** * Verifies that the ClusterEnvironment is configured with DefaultJsonSerializer to prevent the Couchbase SDK from * auto-detecting non-shaded Jackson on the classpath (CAMEL-22090). When non-shaded Jackson is present (e.g., via diff --git a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/integration/ConsumeSqlQueryIT.java b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/integration/ConsumeSqlQueryIT.java index d8bd01a37b01..8da0ae899300 100644 --- a/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/integration/ConsumeSqlQueryIT.java +++ b/components/camel-couchbase/src/test/java/org/apache/camel/component/couchbase/integration/ConsumeSqlQueryIT.java @@ -84,8 +84,8 @@ public class ConsumeSqlQueryIT extends CamelTestSupport { } @Test - public void testConsumeWithSqlQueryAndFullDocument() throws Exception { - MockEndpoint mock = getMockEndpoint("mock:fullDoc"); + public void testConsumeWithExplicitSqlQuery() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:explicit"); mock.expectedMinimumMessageCount(10); MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); @@ -98,6 +98,21 @@ public class ConsumeSqlQueryIT extends CamelTestSupport { } } + @Test + public void testConsumeWithAutoGeneratedSqlQuery() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:auto"); + mock.expectedMinimumMessageCount(10); + + MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); + + // Verify headers are set correctly with auto-generated SQL++ + for (Exchange exchange : mock.getReceivedExchanges()) { + String id = exchange.getIn().getHeader(CouchbaseConstants.HEADER_ID, String.class); + assertNotNull(id, "Document ID header should be set"); + assertTrue(id.startsWith("DocumentID_"), "Document ID should match inserted documents"); + } + } + @Test public void testConsumeWithSqlQueryRawResult() throws Exception { MockEndpoint mock = getMockEndpoint("mock:raw"); @@ -134,10 +149,14 @@ public class ConsumeSqlQueryIT extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() { - // SQL++ with fullDocument=true (default) — fetches complete document via KV get - String fullDocQuery = "SELECT META().id AS __id, * FROM `" + bucketName + "` LIMIT 10"; - from(getConnectionUri() + "&statement=" + fullDocQuery) - .to("mock:fullDoc"); + // Explicit SQL++ statement + String explicitQuery = "SELECT META().id AS __id, * FROM `" + bucketName + "` LIMIT 10"; + from(getConnectionUri() + "&statement=" + explicitQuery) + .to("mock:explicit"); + + // Auto-generated SQL++ from endpoint options (no statement, useView=false is the default) + from(getConnectionUri() + "&limit=10") + .to("mock:auto"); // SQL++ with fullDocument=false — uses raw query result row as body String rawQuery = "SELECT META().id AS __id, * FROM `" + bucketName + "` LIMIT 5"; diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc index bd1f030c5aca..411bea6e0528 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc @@ -405,8 +405,13 @@ The `designDocumentName` and `viewName` endpoint options are now deprecated. Map deprecated in Couchbase Server 7.0 and do not work with the Magma storage backend (default since Couchbase Server 8.0). -A new `statement` endpoint option has been added to support SQL++ (N1QL) queries as the recommended -alternative. See the component documentation for migration guidance. +The consumer now defaults to SQL++ (N1QL) queries instead of MapReduce Views. A new `statement` +endpoint option allows providing explicit SQL++ queries. When no `statement` is set and `useView` is +`false` (the default), the consumer auto-generates a SQL++ query from the endpoint options +(`bucket`, `collection`, `limit`, `skip`, `descending`, `rangeStartKey`, `rangeEndKey`). + +To continue using the deprecated MapReduce Views, set `useView=true` explicitly. See the component +documentation for migration guidance. === camel-ftp diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/CouchbaseComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/CouchbaseComponentBuilderFactory.java index d6b456bac891..bcc6a32fb857 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/CouchbaseComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/CouchbaseComponentBuilderFactory.java @@ -24,8 +24,8 @@ import org.apache.camel.builder.component.ComponentBuilder; import org.apache.camel.component.couchbase.CouchbaseComponent; /** - * Query Couchbase Views with a poll strategy and/or perform various operations - * against Couchbase databases. + * Query Couchbase databases using SQL (N1QL) queries or MapReduce Views with a + * poll strategy and/or perform various operations against Couchbase databases. * * Generated by camel build tools - do NOT edit this file! */ @@ -34,8 +34,9 @@ public interface CouchbaseComponentBuilderFactory { /** * Couchbase (camel-couchbase) - * Query Couchbase Views with a poll strategy and/or perform various - * operations against Couchbase databases. + * Query Couchbase databases using SQL (N1QL) queries or MapReduce Views + * with a poll strategy and/or perform various operations against Couchbase + * databases. * * Category: database * Since: 2.19 diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java index 8f25d8dcbfc6..21e31040c8c4 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CouchbaseEndpointBuilderFactory.java @@ -350,7 +350,9 @@ public interface CouchbaseEndpointBuilderFactory { * consumer uses SQL queries instead of MapReduce views. The query * should select META().id AS __id to identify documents. Example: * SELECT META().id AS __id, FROM myCollection WHERE type = 'order' - * LIMIT 100. + * LIMIT 100. If not set and useView is false, a SQL query is + * auto-generated from the bucket, scope, collection, limit, skip, + * descending, rangeStartKey, and rangeEndKey options. * * The option is a: <code>java.lang.String</code> type. * @@ -363,6 +365,40 @@ public interface CouchbaseEndpointBuilderFactory { doSetProperty("statement", statement); return this; } + /** + * If true, use the deprecated MapReduce Views to query documents via + * designDocumentName and viewName. If false (default), use SQL queries + * instead. + * + * The option is a: <code>boolean</code> type. + * + * Default: false + * Group: consumer + * + * @param useView the value to set + * @return the dsl builder + */ + default CouchbaseEndpointConsumerBuilder useView(boolean useView) { + doSetProperty("useView", useView); + return this; + } + /** + * If true, use the deprecated MapReduce Views to query documents via + * designDocumentName and viewName. If false (default), use SQL queries + * instead. + * + * The option will be converted to a <code>boolean</code> type. + * + * Default: false + * Group: consumer + * + * @param useView the value to set + * @return the dsl builder + */ + default CouchbaseEndpointConsumerBuilder useView(String useView) { + doSetProperty("useView", useView); + return this; + } /** * The view name to use. Deprecated: use the statement option with SQL * queries instead.
