---
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    funktion.fabric8.io/kind: Connector
  name: solrcloud
data:
  deployment.yml: |
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        funktion.fabric8.io/kind: Subscription
        connector: solrcloud
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            funktion.fabric8.io/kind: Subscription
            connector: solrcloud
        spec:
          containers:
          - image: funktion/connector-solrcloud:${project.version}
            name: connector
  schema.yml: |
    ---
    component:
      kind: component
      scheme: solrCloud
      alternativeSchemes: solr,solrs,solrCloud
      syntax: solrCloud:url
      title: Solr
      description: The solr component allows you to interface with an Apache Lucene Solr server.
      label: monitoring,search
      deprecated: false
      async: false
      producerOnly: true
      javaType: org.apache.camel.component.solr.SolrComponent
      groupId: org.apache.camel
      artifactId: camel-solr
      version: 2.18.3
    componentProperties: {}
    properties:
      url:
        kind: path
        group: producer
        required: true
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Hostname and port for the solr server
        order: 0
      allowCompression:
        kind: parameter
        group: producer
        type: boolean
        javaType: java.lang.Boolean
        deprecated: false
        secret: false
        description: Server side must support gzip or deflate for this to have any effect
        order: 1
      connectionTimeout:
        kind: parameter
        group: producer
        type: integer
        javaType: java.lang.Integer
        deprecated: false
        secret: false
        description: connectionTimeout on the underlying HttpConnectionManager
        order: 2
      defaultMaxConnectionsPerHost:
        kind: parameter
        group: producer
        type: integer
        javaType: java.lang.Integer
        deprecated: false
        secret: false
        description: maxConnectionsPerHost on the underlying HttpConnectionManager
        order: 3
      followRedirects:
        kind: parameter
        group: producer
        type: boolean
        javaType: java.lang.Boolean
        deprecated: false
        secret: false
        description: indicates whether redirects are used to get to the Solr server
        order: 4
      maxRetries:
        kind: parameter
        group: producer
        type: integer
        javaType: java.lang.Integer
        deprecated: false
        secret: false
        description: Maximum number of retries to attempt in the event of transient errors
        order: 5
      maxTotalConnections:
        kind: parameter
        group: producer
        type: integer
        javaType: java.lang.Integer
        deprecated: false
        secret: false
        description: maxTotalConnection on the underlying HttpConnectionManager
        order: 6
      requestHandler:
        kind: parameter
        group: producer
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Set the request handler to be used
        order: 7
      soTimeout:
        kind: parameter
        group: producer
        type: integer
        javaType: java.lang.Integer
        deprecated: false
        secret: false
        description: Read timeout on the underlying HttpConnectionManager. This is desirable for queries but probably not for indexing
        order: 8
      streamingQueueSize:
        kind: parameter
        group: producer
        type: integer
        javaType: int
        deprecated: false
        secret: false
        defaultValue: "10"
        description: Set the queue size for the StreamingUpdateSolrServer
        order: 9
      streamingThreadCount:
        kind: parameter
        group: producer
        type: integer
        javaType: int
        deprecated: false
        secret: false
        defaultValue: "2"
        description: Set the number of threads for the StreamingUpdateSolrServer
        order: 10
      synchronous:
        kind: parameter
        group: advanced
        label: advanced
        type: boolean
        javaType: boolean
        deprecated: false
        secret: false
        defaultValue: false
        description: Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
        order: 11
      collection:
        kind: parameter
        group: solrCloud
        label: solrCloud
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Set the collection name which the solrCloud server could use
        order: 12
      zkHost:
        kind: parameter
        group: solrCloud
        label: solrCloud
        type: string
        javaType: java.lang.String
        deprecated: false
        secret: false
        description: Set the ZooKeeper host information which the solrCloud could use such as zkhost=localhost:8123.
        order: 13
  documentation.adoc: |+
    [[Solr-SolrComponent]]
    Solr Component
    ~~~~~~~~~~~~~~

    *Available as of Camel 2.9*

    The Solr component allows you to interface with an
    http://lucene.apache.org/solr/[Apache Lucene Solr] server (based on
    SolrJ 3.5.0).

    Maven users will need to add the following dependency to their `pom.xml`
    for this component:

    [source,xml]
    ------------------------------------------------------------
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-solr</artifactId>
        <version>x.x.x</version>
        <!-- use the same version as your Camel core version -->
    </dependency>
    ------------------------------------------------------------

    [[Solr-URIformat]]
    URI format
    ^^^^^^^^^^

    *NOTE:* solrs and solrCloud are new added since *Camel 2.14*.

    [source,java]
    --------------------------------------
    solr://host[:port]/solr?[options]
    solrs://host[:port]/solr?[options]
    solrCloud://host[:port]/solr?[options]
    --------------------------------------

    [[Solr-Options]]
    Solr Options
    ^^^^^^^^^^^^


    // component options: START
    The Solr component has no options.
    // component options: END



    // endpoint options: START
    The Solr component supports 14 endpoint options which are listed below:

    {% raw %}
    [width="100%",cols="2,1,1m,1m,5",options="header"]
    |=======================================================================
    | Name | Group | Default | Java Type | Description
    | url | producer |  | String | *Required* Hostname and port for the solr server
    | allowCompression | producer |  | Boolean | Server side must support gzip or deflate for this to have any effect
    | connectionTimeout | producer |  | Integer | connectionTimeout on the underlying HttpConnectionManager
    | defaultMaxConnectionsPerHost | producer |  | Integer | maxConnectionsPerHost on the underlying HttpConnectionManager
    | followRedirects | producer |  | Boolean | indicates whether redirects are used to get to the Solr server
    | maxRetries | producer |  | Integer | Maximum number of retries to attempt in the event of transient errors
    | maxTotalConnections | producer |  | Integer | maxTotalConnection on the underlying HttpConnectionManager
    | requestHandler | producer |  | String | Set the request handler to be used
    | soTimeout | producer |  | Integer | Read timeout on the underlying HttpConnectionManager. This is desirable for queries but probably not for indexing
    | streamingQueueSize | producer | 10 | int | Set the queue size for the StreamingUpdateSolrServer
    | streamingThreadCount | producer | 2 | int | Set the number of threads for the StreamingUpdateSolrServer
    | synchronous | advanced | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
    | collection | solrCloud |  | String | Set the collection name which the solrCloud server could use
    | zkHost | solrCloud |  | String | Set the ZooKeeper host information which the solrCloud could use such as zkhost=localhost:8123.
    |=======================================================================
    {% endraw %}
    // endpoint options: END


    [[Solr-MessageOperations]]
    Message Operations
    ^^^^^^^^^^^^^^^^^^

    The following Solr operations are currently supported. Simply set an
    exchange header with a key of "SolrOperation" and a value set to one of
    the following. Some operations also require the message body to be set.

    * the INSERT operations use the
    http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.html[CommonsHttpSolrServer]
    * the INSERT_STREAMING operations use the
    http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.html[StreamingUpdateSolrServer]
    (*Camel 2.9.2*)

    [width="100%",cols="10%,10%,80%",options="header",]
    |=======================================================================
    |Operation |Message body |Description

    |INSERT/INSERT_STREAMING |n/a |adds an index using message headers (must be prefixed with "SolrField.")

    |INSERT/INSERT_STREAMING |File |adds an index using the given File (using ContentStreamUpdateRequest)

    |INSERT/INSERT_STREAMING |SolrInputDocument |*Camel 2.9.2* updates index based on the given SolrInputDocument

    |INSERT/INSERT_STREAMING |String XML |*Camel 2.9.2* updates index based on the given XML (must follow
    SolrInputDocument format)

    |ADD_BEAN |bean instance |adds an index based on values in an
    http://wiki.apache.org/solr/Solrj#Directly_adding_POJOs_to_Solr[annotated
    bean]

    |ADD_BEANS |collection<bean> |*Camel 2.15* adds index based on a collection of
    http://wiki.apache.org/solr/Solrj#Directly_adding_POJOs_to_Solr[annotated
    bean]

    |DELETE_BY_ID |index id to delete |delete a record by ID

    |DELETE_BY_QUERY |query string |delete a record by a query

    |COMMIT |n/a |performs a commit on any pending index changes

    |ROLLBACK |n/a |performs a rollback on any pending index changes

    |OPTIMIZE |n/a |performs a commit on any pending index changes and then runs the
    optimize command
    |=======================================================================

    [[Solr-Example]]
    Example
    ^^^^^^^

    Below is a simple INSERT, DELETE and COMMIT example

    [source,java]
    ---------------------------------------------------------------------------------------
    from("direct:insert")
        .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_INSERT))
        .setHeader(SolrConstants.FIELD + "id", body())
        .to("solr://localhost:8983/solr");

    from("direct:delete")
        .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_DELETE_BY_ID))
        .to("solr://localhost:8983/solr");

    from("direct:commit")
        .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT))
        .to("solr://localhost:8983/solr");
    ---------------------------------------------------------------------------------------

    [source,xml]
    ------------------------------------------
    <route>
        <from uri="direct:insert"/>
        <setHeader headerName="SolrOperation">
            <constant>INSERT</constant>
        </setHeader>
        <setHeader headerName="SolrField.id">
            <simple>${body}</simple>
        </setHeader>
        <to uri="solr://localhost:8983/solr"/>
    </route>
    <route>
        <from uri="direct:delete"/>
        <setHeader headerName="SolrOperation">
            <constant>DELETE_BY_ID</constant>
        </setHeader>
        <to uri="solr://localhost:8983/solr"/>
    </route>
    <route>
        <from uri="direct:commit"/>
        <setHeader headerName="SolrOperation">
            <constant>COMMIT</constant>
        </setHeader>
        <to uri="solr://localhost:8983/solr"/>
    </route>
    ------------------------------------------

    A client would simply need to pass a body message to the insert or
    delete routes and then call the commit route.

    [source,java]
    -----------------------------------------------
        template.sendBody("direct:insert", "1234");
        template.sendBody("direct:commit", null);
        template.sendBody("direct:delete", "1234");
        template.sendBody("direct:commit", null);
    -----------------------------------------------

    [[Solr-QueryingSolr]]
    Querying Solr
    ^^^^^^^^^^^^^

    Currently, this component doesn't support querying data natively (may be
    added later). For now, you can query Solr using link:http.html[HTTP] as
    follows:

    [source,java]
    --------------------------------------------------------------------------------
    //define the route to perform a basic query
    from("direct:query")
        .recipientList(simple("http://localhost:8983/solr/select/?q=${body}"))
        .convertBodyTo(String.class);
    ...
    //query for an id of '1234' (url encoded)
    String responseXml = (String) template.requestBody("direct:query", "id%3A1234");
    --------------------------------------------------------------------------------

    For more information, see these resources...

    http://lucene.apache.org/solr/tutorial.html#Querying+Data[Solr Query
    Tutorial]

    http://wiki.apache.org/solr/SolrQuerySyntax[Solr Query Syntax]

    [[Solr-SeeAlso]]
    See Also
    ^^^^^^^^

    * link:configuring-camel.html[Configuring Camel]
    * link:component.html[Component]
    * link:endpoint.html[Endpoint]
    * link:getting-started.html[Getting Started]

