Repository: incubator-unomi Updated Branches: refs/heads/UNOMI-28-ES-2-X-UPGRADE [created] 131a06aa7
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/core/src/main/resources/elasticsearch.yml ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/core/src/main/resources/elasticsearch.yml b/persistence-elasticsearch/core/src/main/resources/elasticsearch.yml index 293f734..fe0e52f 100644 --- a/persistence-elasticsearch/core/src/main/resources/elasticsearch.yml +++ b/persistence-elasticsearch/core/src/main/resources/elasticsearch.yml @@ -1,269 +1,103 @@ -##################### ElasticSearch Configuration Example ##################### - -# This file contains an overview of various configuration settings, -# targeted at operations staff. Application developers should -# consult the guide at <http://elasticsearch.org/guide>. +# ======================== Elasticsearch Configuration ========================= # -# The installation procedure is covered at -# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>. +# NOTE: Elasticsearch comes with reasonable defaults for most settings. +# Before you set out to tweak and tune the configuration, make sure you +# understand what are you trying to accomplish and the consequences. # -# ElasticSearch comes with reasonable defaults for most settings, -# so you can try it out without bothering with configuration. +# The primary way of configuring a node is via this file. This template lists +# the most important settings you may want to configure for a production cluster. # -# Most of the time, these defaults are just fine for running a production -# cluster. If you're fine-tuning your cluster, or wondering about the -# effect of certain configuration option, please _do ask_ on the -# mailing list or IRC channel [http://elasticsearch.org/community]. - -# Any element in the configuration can be replaced with environment variables -# by placing them in ${...} notation. For example: +# Please see the documentation for further information on configuration options: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html> # -# node.rack: ${RACK_ENV_VAR} - -# For information on supported formats and syntax for the config file, see -# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html> - - -################################### Cluster ################################### - -# Cluster name identifies your cluster for auto-discovery. If you're running -# multiple clusters on the same network, make sure you're using unique names. +# ---------------------------------- Cluster ----------------------------------- # -# cluster.name: contextElasticSearch - - -#################################### Node ##################################### - -# Node names are generated dynamically on startup, so you're relieved -# from configuring them manually. You can tie this node to a specific name: -# -# node.name: "od-fts1a" - -# Every node can be configured to allow or deny being eligible as the master, -# and to allow or deny to store the data. +# Use a descriptive name for your cluster: # -# Allow this node to be eligible as a master node (enabled by default): +# cluster.name: my-application # -# node.master: true +# ------------------------------------ Node ------------------------------------ # -# Allow this node to store data (enabled by default): +# Use a descriptive name for the node: # -# node.data: true - -# You can exploit these settings to design advanced cluster topologies. +# node.name: node-1 # -# 1. You want this node to never become a master node, only to hold data. -# This will be the "workhorse" of your cluster. +# Add custom attributes to the node: # -# node.master: false -# node.data: true +# node.rack: r1 # -# 2. You want this node to only serve as a master: to not store any data and -# to have free resources. This will be the "coordinator" of your cluster. +# ----------------------------------- Paths ------------------------------------ # -# node.master: true -# node.data: false +# Path to directory where to store the data (separate multiple locations by comma): # -# 3. You want this node to be neither master nor data node, but -# to act as a "search load balancer" (fetching data from nodes, -# aggregating results, etc.) -# -# node.master: false -# node.data: false - -# Use the Cluster Health API [http://localhost:9200/_cluster/health], the -# Node Info API [http://localhost:9200/_cluster/nodes] or GUI tools -# such as <http://github.com/lukas-vlcek/bigdesk> and -# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state. - -# A node can have generic attributes associated with it, which can later be used -# for customized shard allocation filtering, or allocation awareness. An attribute -# is a simple key value pair, similar to node.key: value, here is an example: +# path.data: /path/to/data # -# node.rack: rack314 - -# By default, multiple nodes are allowed to start from the same installation location -# to disable it, set the following: -# node.max_local_storage_nodes: 1 - - -#################################### Index #################################### - -# You can set a number of options (such as shard/replica options, mapping -# or analyzer definitions, translog settings, ...) for indices globally, -# in this file. +# Path to log files: # -# Note, that it makes more sense to configure index settings specifically for -# a certain index, either when creating it or by using the index templates API. +# path.logs: /path/to/logs # -# See <http://elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html> and -# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html> -# for more information. - -# Set the number of shards (splits) of an index (5 by default): +# ----------------------------------- Memory ----------------------------------- # -# index.number_of_shards: 2 - -# Set the number of replicas (additional copies) of an index (1 by default): +# Lock the memory on startup: # -# index.number_of_replicas: 1 - -# Note, that for development on a local machine, with small indices, it usually -# makes sense to "disable" the distributed features: +# bootstrap.mlockall: true # -# index.number_of_shards: 1 -# index.number_of_replicas: 0 - -# These settings directly affect the performance of index and search operations -# in your cluster. Assuming you have enough machines to hold shards and -# replicas, the rule of thumb is: +# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory +# available on the system and that the owner of the process is allowed to use this limit. # -# 1. Having more *shards* enhances the _indexing_ performance and allows to -# _distribute_ a big index across machines. -# 2. Having more *replicas* enhances the _search_ performance and improves the -# cluster _availability_. +# Elasticsearch performs poorly when the system is swapping the memory. # -# The "number_of_shards" is a one-time setting for an index. +# ---------------------------------- Network ----------------------------------- # -# The "number_of_replicas" can be increased or decreased anytime, -# by using the Index Update Settings API. +# Set the bind address to a specific IP (IPv4 or IPv6): # -# ElasticSearch takes care about load balancing, relocating, gathering the -# results from nodes, etc. Experiment with different settings to fine-tune -# your setup. - -# Use the Index Status API (<http://localhost:9200/A/_status>) to inspect -# the index status. - -http.cors.enabled: true -index.percolator.allow_unmapped_fields: true - -#################################### Paths #################################### - -# Path to directory containing configuration (this file and logging.yml): +# network.host: 192.168.0.1 # -# path.conf: /path/to/conf - -# Path to directory where to store index data allocated for this node. +# Set a custom port for HTTP: # -# path.data: /path/to/data +# http.port: 9200 # -# Can optionally include more than one location, causing data to be striped across -# the locations (a la RAID 0) on a file level, favouring locations with most free -# space on creation. For example: +# For more information, see the documentation at: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html> # -# path.data: /path/to/data1,/path/to/data2 - -# Path to temporary files: +# --------------------------------- Discovery ---------------------------------- # -# path.work: /path/to/work - -# Path to log files: +# Pass an initial list of hosts to perform discovery when new node is started: +# The default list of hosts is ["127.0.0.1", "[::1]"] # -# path.logs: /path/to/logs - -# Path to where plugins are installed: +# discovery.zen.ping.unicast.hosts: ["host1", "host2"] # -# path.plugins: /path/to/plugins - - -#################################### Plugin ################################### - -# If a plugin listed here is not installed for current node, the node will not start. +# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1): # -# plugin.mandatory: mapper-attachments,lang-groovy - - -################################### Memory #################################### - -# ElasticSearch performs poorly when JVM starts swapping: you should ensure that -# it _never_ swaps. +# discovery.zen.minimum_master_nodes: 3 # -# Set this property to true to lock the memory: +# For more information, see the documentation at: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html> # -# bootstrap.mlockall: true - -# Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set -# to the same value, and that the machine has enough memory to allocate -# for ElasticSearch, leaving enough memory for the operating system itself. +# ---------------------------------- Gateway ----------------------------------- # -# You should also make sure that the ElasticSearch process is allowed to lock -# the memory, eg. by using `ulimit -l unlimited`. - - -############################## Network And HTTP ############################### - -# ElasticSearch, by default, binds itself to the 0.0.0.0 address, and listens -# on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node -# communication. (the range means that if the port is busy, it will automatically -# try the next port). - -# Set the bind address specifically (IPv4 or IPv6): +# Block initial recovery after a full cluster restart until N nodes are started: # -# network.bind_host: 192.168.0.1 - -# Set the address other nodes will use to communicate with this node. If not -# set, it is automatically derived. It must point to an actual IP address. +# gateway.recover_after_nodes: 3 # -# network.publish_host: 192.168.0.1 - -# Set both 'bind_host' and 'publish_host': +# For more information, see the documentation at: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html> # -# network.host: 192.168.0.1 - -# Set a custom port for the node to node communication (9300 by default): +# ---------------------------------- Various ----------------------------------- # -# transport.tcp.port: 9300 - -# Enable compression for all communication between nodes (disabled by default): +# Disable starting multiple nodes on a single system: # -# transport.tcp.compress: true - -# Set a custom port to listen for HTTP traffic: -# -# http.port: 9200 - -# Set a custom allowed content length: -# -# http.max_content_length: 100mb - -# Disable HTTP completely: -# -# http.enabled: false - - -################################### Gateway ################################### - -# The gateway allows for persisting the cluster state between full cluster -# restarts. Every change to the state (such as adding an index) will be stored -# in the gateway, and when the cluster starts up for the first time, -# it will read its state from the gateway. - -# There are several types of gateway implementations. For more information, see -# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>. - -# The default gateway type is the "local" gateway (recommended): +# node.max_local_storage_nodes: 1 # -# gateway.type: local - -# Settings below control how and when to start the initial recovery process on -# a full cluster restart (to reuse as much local data as possible when using shared -# gateway). - -# Allow recovery process after N nodes in a cluster are up: +# Require explicit names when deleting indices: # -# gateway.recover_after_nodes: 1 - -# Set the timeout to initiate the recovery process, once the N nodes -# from previous setting are up (accepts time value): +# action.destructive_requires_name: true # -# gateway.recover_after_time: 10m - -# Set how many nodes are expected in this cluster. Once these N nodes -# are up (and recover_after_nodes is met), begin recovery process immediately -# (without waiting for recover_after_time to expire): +# --------------------------- Apache Unomi specific --------------------------- # -# gateway.expected_nodes: 2 +threadpool.index.queue_size: 1000 +script.engine.groovy.inline.update: on +index.percolator.allow_unmapped_fields: true # Require explicit index creation action.auto_create_index: false @@ -274,106 +108,3 @@ action.auto_create_index: false #action.disable_close_all_indices: true #action.disable_delete_all_indices: true #action.disable_shutdown: true - -############################# Recovery Throttling ############################# - -# These settings allow to control the process of shards allocation between -# nodes during initial recovery, replica allocation, rebalancing, -# or when adding and removing nodes. - -# Set the number of concurrent recoveries happening on a node: -# -# 1. During the initial recovery -# -# cluster.routing.allocation.node_initial_primaries_recoveries: 4 -# -# 2. During adding/removing nodes, rebalancing, etc -# -# cluster.routing.allocation.node_concurrent_recoveries: 2 - -# Set to throttle throughput when recovering (eg. 100mb, by default 20mb): -# -#indices.recovery.max_bytes_per_sec: 100mb - -# Set to limit the number of open concurrent streams when -# recovering a shard from a peer: -# -# indices.recovery.concurrent_streams: 5 - - -################################## Discovery ################################## - -# Discovery infrastructure ensures nodes can be found within a cluster -# and master node is elected. Multicast discovery is the default. - -# Set to ensure a node sees N other master eligible nodes to be considered -# operational within the cluster. Its recommended to set it to a higher value -# than 1 when running more than 2 nodes in the cluster. -# -# discovery.zen.minimum_master_nodes: 1 - -# Set the time to wait for ping responses from other nodes when discovering. -# Set this option to a higher value on a slow or congested network -# to minimize discovery failures: -# -# discovery.zen.ping.timeout: 3s - -# For more information, see -# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html> - -# Unicast discovery allows to explicitly control which nodes will be used -# to discover the cluster. It can be used when multicast is not present, -# or to restrict the cluster communication-wise. -# -# 1. Disable multicast discovery (enabled by default): -# -# discovery.zen.ping.multicast.enabled: false -# -# 2. Configure an initial list of master nodes in the cluster -# to perform discovery when new nodes (master or data) are started: -# -# discovery.zen.ping.unicast.hosts: ["host1", "host2:port"] - -# EC2 discovery allows to use AWS EC2 API in order to perform discovery. -# -# You have to install the cloud-aws plugin for enabling the EC2 discovery. -# -# For more information, see -# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-ec2.html> -# -# See <http://elasticsearch.org/tutorials/elasticsearch-on-ec2/> -# for a step-by-step tutorial. - - -################################## Slow Log ################################## - -# Shard level query and fetch threshold logging. - -#index.search.slowlog.threshold.query.warn: 10s -#index.search.slowlog.threshold.query.info: 5s -#index.search.slowlog.threshold.query.debug: 2s -#index.search.slowlog.threshold.query.trace: 500ms - -#index.search.slowlog.threshold.fetch.warn: 1s -#index.search.slowlog.threshold.fetch.info: 800ms -#index.search.slowlog.threshold.fetch.debug: 500ms -#index.search.slowlog.threshold.fetch.trace: 200ms - -#index.indexing.slowlog.threshold.index.warn: 10s -#index.indexing.slowlog.threshold.index.info: 5s -#index.indexing.slowlog.threshold.index.debug: 2s -#index.indexing.slowlog.threshold.index.trace: 500ms - -################################## GC Logging ################################ - -#monitor.jvm.gc.ParNew.warn: 1000ms -#monitor.jvm.gc.ParNew.info: 700ms -#monitor.jvm.gc.ParNew.debug: 400ms - -#monitor.jvm.gc.ConcurrentMarkSweep.warn: 10s -#monitor.jvm.gc.ConcurrentMarkSweep.info: 5s -#monitor.jvm.gc.ConcurrentMarkSweep.debug: 2s - -################################## Thread Pool ############################### -threadpool.index.queue_size: 1000 -script.engine.groovy.inline.update: on http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotEscapeTest.java ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotEscapeTest.java b/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotEscapeTest.java new file mode 100644 index 0000000..c4322dc --- /dev/null +++ b/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotEscapeTest.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.unomi.persistence.elasticsearch; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +/** + * A unit test class for the FieldDotEscaper utility methods + */ +public class FieldDotEscapeTest { + + @Test + public void testTrickyJson() { + String result = FieldDotEscaper.escapeJson("{\"tricking_the_parser\" : \"this.should.not\\\": match.either\"}"); + Assert.assertTrue("Found escaped pattern instead of untouched one", result.contains("this.should.not\\\": match.either")); + } + + @Test + public void testJustDot() { + String result = FieldDotEscaper.escapeJson("{\".\" : \"this.should.not\\\": match.either\"}"); + Assert.assertTrue("Didn't find expected escaped pattern", result.contains("\"__DOT__\"")); + Assert.assertTrue("Found escaped pattern instead of untouched one", result.contains("this.should.not\\\": match.either")); + } + + @Test + public void testComplexJson() throws IOException { + InputStream complexJsonInputStream = this.getClass().getClassLoader().getResourceAsStream("complex.json"); + String input = IOUtils.toString(complexJsonInputStream); + System.out.println("Original JSON:"); + System.out.println("================="); + System.out.println(input); + Set<String> modifiedNames = new LinkedHashSet<>(); + String result = FieldDotEscaper.escapeJson(input, modifiedNames); + System.out.println("Modified names:"); + System.out.println("================="); + for (String modifiedName : modifiedNames) { + System.out.println(modifiedName); + } + System.out.println("Transformed JSON:"); + System.out.println("================="); + System.out.println(result); + Assert.assertTrue("Didn't find expected escaped pattern", result.contains("src_terms[0]__DOT__fields__DOT__siteContent")); + Assert.assertTrue("Didn't find expected escaped pattern", result.contains("newline__DOT__test")); + Assert.assertTrue("Found escaped pattern instead of untouched one", result.contains("this.should.never:match")); + Assert.assertTrue("Found escaped pattern instead of untouched one", result.contains("this.should.not\\\": match.either")); + result = FieldDotEscaper.unescapeJson(result); + Assert.assertEquals("Round trip of escaping then unescaping should be identical", input, result); + } + + @Test + public void testString() { + String input = "this.is.a..test"; + String result = FieldDotEscaper.unescapeString(FieldDotEscaper.escapeString(input)); + Assert.assertEquals("Strings should be exactly the same", input, result); + } + + @Test + public void testMap() { + Map<String,Object> input = new HashMap<>(); + input.put("this.is.a..test", "1"); + input.put("another.test", "2"); + Map<? extends String,?> result = FieldDotEscaper.unescapeMap(FieldDotEscaper.escapeMap(input)); + Assert.assertEquals("Maps should be identical", input, result); + } + + @Test + public void testProperties() { + Properties input = new Properties(); + input.put("this.is.a..test", "1"); + input.put("another.test", "2"); + Properties result = FieldDotEscaper.unescapeProperties(FieldDotEscaper.escapeProperties(input)); + Assert.assertEquals("Properties should be identical", input, result); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotJsonTransformerTest.java ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotJsonTransformerTest.java b/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotJsonTransformerTest.java new file mode 100644 index 0000000..284ac84 --- /dev/null +++ b/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/FieldDotJsonTransformerTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.unomi.persistence.elasticsearch; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +/** + * A unit test class for our custom JSON parser. + */ +public class FieldDotJsonTransformerTest { + + @Test + public void testNoReplacement() throws IOException { + InputStream complexJsonInputStream = this.getClass().getClassLoader().getResourceAsStream("complex.json"); + String input = IOUtils.toString(complexJsonInputStream); + StringBuffer output = new StringBuffer(); + FieldDotJsonTransformer fieldDotJsonTransformer = new FieldDotJsonTransformer(input, output, null); + fieldDotJsonTransformer.transform(); + Assert.assertEquals("Parsed JSON and original should be identical", input, output.toString()); + InputStream profileJsonInputStream = this.getClass().getClassLoader().getResourceAsStream("profile.json"); + input = IOUtils.toString(profileJsonInputStream); + output = new StringBuffer(); + fieldDotJsonTransformer = new FieldDotJsonTransformer(input, output, null); + fieldDotJsonTransformer.transform(); + Assert.assertEquals("Parsed JSON and original should be identical", input, output.toString()); + } + + @Test + public void testWithJackson() throws IOException { + InputStream complexJsonInputStream = this.getClass().getClassLoader().getResourceAsStream("complex.json"); + String input = IOUtils.toString(complexJsonInputStream); + StringBuffer output = new StringBuffer(); + FieldDotJsonTransformer fieldDotJsonTransformer = new FieldDotJsonTransformer(input, output, FieldDotEscaper.DOT_ESCAPE_MARKER); + fieldDotJsonTransformer.transform(); + ObjectMapper objectMapper = new ObjectMapper(); + Map<String,Object> object = objectMapper.readValue(output.toString(), Map.class); + Assert.assertNotNull("Object parsed with Jackson should not be null", object); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/core/src/test/resources/complex.json ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/core/src/test/resources/complex.json b/persistence-elasticsearch/core/src/test/resources/complex.json new file mode 100644 index 0000000..c6ff41c --- /dev/null +++ b/persistence-elasticsearch/core/src/test/resources/complex.json @@ -0,0 +1,50 @@ +{ + "events": [ + { + "scope": "ACMESPACE", + "eventType": "form", + "source": { + "itemType": "page", + "scope": "ACMESPACE", + "itemId": "${pageId}", + "properties": { + "pageInfo": { + "pageID": "${pageId}", + "pageName": "${pageName}", + "pagePath": "${pagePath}", + "destinationURL": "${destinationURL}", + "referringURL": "${previousURL}", + "language": "${language}" + }, + "category": {}, + "attributes": { + "colon_in_value" : "this.should.never:match", + "newline.test" + : "more.dots", + "tricking_the_parser" : "this.should.not\": match.either", + "unicode black star": "before\u2605after", + "escaping test" : "\"\n\r\t\\" + } + } + }, + "target": { + "itemType": "form", + "scope": "ACMESPACE", + "itemId": "searchForm" + }, + "properties": { + "jcrMethodToCall": "get", + "src_originSiteKey": "ACMESPACE", + "src_terms[0].term": "${word}", + "src_terms[0].applyFilter": "true", + "src_terms[0].match": "all_words", + "src_terms[0].fields.siteContent": "true", + "src_terms[0].fields.tags": "true", + "src_terms[0].fields.files": "true", + "src_sites.values": "ACMESPACE", + "src_sitesForReferences.values": "systemsite", + "src_languages.values": "en" + } + } + ] +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/core/src/test/resources/profile.json ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/core/src/test/resources/profile.json b/persistence-elasticsearch/core/src/test/resources/profile.json new file mode 100644 index 0000000..8fc9d2c --- /dev/null +++ b/persistence-elasticsearch/core/src/test/resources/profile.json @@ -0,0 +1 @@ +{"itemId":"6bb362d8-d094-44b4-ba2e-012163286825","itemType":"personaSession","scope":null,"profileId":"googleBot","profile":{"itemId":"googleBot","itemType":"persona","properties":{"description":"Represents a Google bot","firstName":"Google","lastName":"Bot"},"systemProperties":{},"segments":[],"scores":null,"mergedWith":null},"properties":{"operatingSystemName":"unknown","sessionCountryName":"United States","location":{"lon":-122.084058,"lat":37.422},"userAgentVersion":"2.1","sessionCountryCode":"US","deviceCategory":"Other","operatingSystemFamily":"unknown","userAgentName":"Googlebot/2.1","sessionCity":"Mountain View","remoteHost":"www.google.com","remoteAddr":"66.249.66.1"},"systemProperties":{},"timeStamp":"2014-09-18T09:18:52Z","lastEventDate":"2014-09-18T11:23:59Z","size":0,"duration":7507068} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPlugin.java ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPlugin.java b/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPlugin.java index 61814a1..79fc7d3 100644 --- a/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPlugin.java +++ b/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPlugin.java @@ -20,13 +20,13 @@ package org.apache.unomi.elasticsearch.plugin.security; import org.elasticsearch.common.component.LifecycleComponent; import org.elasticsearch.common.inject.Module; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.plugins.AbstractPlugin; +import org.elasticsearch.plugins.Plugin; import java.util.Collection; -import static org.elasticsearch.common.collect.Lists.newArrayList; +import static com.google.common.collect.Lists.newArrayList; -public class SecurityPlugin extends AbstractPlugin { +public class SecurityPlugin extends Plugin { public SecurityPlugin(Settings settings) { super(); @@ -41,17 +41,17 @@ public class SecurityPlugin extends AbstractPlugin { } @Override - public Collection<Class<? extends Module>> modules() { - Collection<Class<? extends Module>> modules = newArrayList(); + public Collection<Module> nodeModules() { + Collection<Module> modules = newArrayList(); // if (settings.getAsBoolean("security.enabled", true)) { - modules.add(SecurityPluginModule.class); + modules.add(new SecurityPluginModule()); // } return modules; } @SuppressWarnings("rawtypes") @Override - public Collection<Class<? extends LifecycleComponent>> services() { + public Collection<Class<? extends LifecycleComponent>> nodeServices() { Collection<Class<? extends LifecycleComponent>> services = newArrayList(); // if (settings.getAsBoolean("security.enabled", true)) { services.add(SecurityPluginService.class); http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginModule.java ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginModule.java b/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginModule.java index 67e1770..353c05f 100644 --- a/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginModule.java +++ b/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginModule.java @@ -18,11 +18,10 @@ package org.apache.unomi.elasticsearch.plugin.security; import org.elasticsearch.common.inject.AbstractModule; -import org.elasticsearch.common.settings.Settings; public class SecurityPluginModule extends AbstractModule { - public SecurityPluginModule(Settings settings) { + public SecurityPluginModule() { super(); } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginService.java ---------------------------------------------------------------------- diff --git a/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginService.java b/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginService.java index f3941ea..6bd73eb 100644 --- a/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginService.java +++ b/persistence-elasticsearch/plugins/security/src/main/java/org/apache/unomi/elasticsearch/plugin/security/SecurityPluginService.java @@ -56,10 +56,10 @@ public class SecurityPluginService extends AbstractLifecycleComponent<SecurityPl super(settings); this.restController = restController; this.transportService = transportService; - this.publishHost = componentSettings.get("publish_host", settings.get("transport.publish_host", settings.get("transport.host"))); + this.publishHost = settings.get("publish_host", settings.get("transport.publish_host", settings.get("transport.host"))); InetAddress publishHostAddress = null; try { - publishHostAddress = networkService.resolvePublishHostAddress(publishHost); + publishHostAddress = networkService.resolvePublishHostAddresses(new String[] { publishHost }); } catch (IOException e) { logger.error("Error trying to resolve publish host address " + publishHost); } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java index c41309b..f5330ed 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/BooleanConditionESQueryBuilder.java @@ -20,10 +20,10 @@ package org.apache.unomi.plugins.baseplugin.conditions; import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -33,8 +33,8 @@ import java.util.Map; public class BooleanConditionESQueryBuilder implements ConditionESQueryBuilder { @Override - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, - ConditionESQueryBuilderDispatcher dispatcher) { + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, + ConditionESQueryBuilderDispatcher dispatcher) { boolean isAndOperator = "and".equalsIgnoreCase((String) condition.getParameter("operator")); @SuppressWarnings("unchecked") List<Condition> conditions = (List<Condition>) condition.getParameter("subConditions"); @@ -45,11 +45,15 @@ public class BooleanConditionESQueryBuilder implements ConditionESQueryBuilder { return dispatcher.buildFilter(conditions.get(0), context); } - FilterBuilder[] l = new FilterBuilder[conditionCount]; + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); for (int i = 0; i < conditionCount; i++) { - l[i] = dispatcher.buildFilter(conditions.get(i)); + if (isAndOperator) { + boolQueryBuilder.must(dispatcher.buildFilter(conditions.get(i))); + } else { + boolQueryBuilder.should(dispatcher.buildFilter(conditions.get(i))); + } } - return isAndOperator ? FilterBuilders.andFilter(l) : FilterBuilders.orFilter(l); + return boolQueryBuilder; } } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/GeoLocationByPointSessionConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/GeoLocationByPointSessionConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/GeoLocationByPointSessionConditionESQueryBuilder.java index 804f4f4..083cfe4 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/GeoLocationByPointSessionConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/GeoLocationByPointSessionConditionESQueryBuilder.java @@ -20,14 +20,14 @@ package org.apache.unomi.plugins.baseplugin.conditions; import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import java.util.Map; public class GeoLocationByPointSessionConditionESQueryBuilder implements ConditionESQueryBuilder { @Override - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { String type = (String) condition.getParameter("type"); if("circle".equals(type)) { @@ -36,7 +36,7 @@ public class GeoLocationByPointSessionConditionESQueryBuilder implements Conditi String distance = condition.getParameter("distance").toString(); if(circleLatitude != null && circleLongitude != null && distance != null) { - return FilterBuilders.geoDistanceFilter("location") + return QueryBuilders.geoDistanceQuery("location") .lat(circleLatitude) .lon(circleLongitude) .distance(distance); @@ -48,7 +48,7 @@ public class GeoLocationByPointSessionConditionESQueryBuilder implements Conditi Double rectLongitudeSW = (Double) condition.getParameter("rectLongitudeSW"); if(rectLatitudeNE != null && rectLongitudeNE != null && rectLatitudeSW != null && rectLongitudeSW != null) { - return FilterBuilders.geoBoundingBoxFilter("location") + return QueryBuilders.geoBoundingBoxQuery("location") .topLeft(rectLatitudeNE, rectLongitudeNE) .bottomRight(rectLatitudeSW, rectLongitudeSW); } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/MatchAllConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/MatchAllConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/MatchAllConditionESQueryBuilder.java index 9efd2c1..700286a 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/MatchAllConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/MatchAllConditionESQueryBuilder.java @@ -20,15 +20,15 @@ package org.apache.unomi.plugins.baseplugin.conditions; import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import java.util.Map; public class MatchAllConditionESQueryBuilder implements ConditionESQueryBuilder { @Override - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { - return FilterBuilders.matchAllFilter(); + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + return QueryBuilders.matchAllQuery(); } } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/NotConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/NotConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/NotConditionESQueryBuilder.java index 7793aa0..9574fe8 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/NotConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/NotConditionESQueryBuilder.java @@ -20,8 +20,8 @@ package org.apache.unomi.plugins.baseplugin.conditions; import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import java.util.Map; @@ -30,8 +30,8 @@ import java.util.Map; */ public class NotConditionESQueryBuilder implements ConditionESQueryBuilder { - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { Condition subCondition = (Condition) condition.getParameter("subCondition"); - return FilterBuilders.notFilter(dispatcher.buildFilter(subCondition, context)); + return QueryBuilders.boolQuery().mustNot(dispatcher.buildFilter(subCondition, context)); } } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java index 1472cf9..84d964f 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PastEventConditionESQueryBuilder.java @@ -26,8 +26,8 @@ import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBui import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; import org.apache.unomi.persistence.spi.PersistenceService; import org.apache.unomi.persistence.spi.aggregate.TermsAggregate; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import java.util.*; @@ -43,7 +43,7 @@ public class PastEventConditionESQueryBuilder implements ConditionESQueryBuilder this.persistenceService = persistenceService; } - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { Condition eventCondition; try { eventCondition = (Condition) condition.getParameter("eventCondition"); @@ -84,6 +84,6 @@ public class PastEventConditionESQueryBuilder implements ConditionESQueryBuilder } } - return FilterBuilders.idsFilter(Profile.ITEM_TYPE).addIds(ids.toArray(new String[ids.size()])); + return QueryBuilders.idsQuery(Profile.ITEM_TYPE).addIds(ids.toArray(new String[ids.size()])); } } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java index d063ff3..23f1df8 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java @@ -22,9 +22,10 @@ import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionContextHelper; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.common.joda.time.DateTime; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.joda.time.DateTime; import java.util.List; import java.util.Map; @@ -35,7 +36,7 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder } @Override - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { String op = (String) condition.getParameter("comparisonOperator"); String name = (String) condition.getParameter("propertyName"); @@ -60,56 +61,60 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder switch (op) { case "equals": checkRequiredValue(value, name, op, false); - return FilterBuilders.termFilter(name, value); + return QueryBuilders.termQuery(name, value); case "notEquals": checkRequiredValue(value, name, op, false); - return FilterBuilders.notFilter(FilterBuilders.termFilter(name, value)); + return QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery(name, value)); case "greaterThan": checkRequiredValue(value, name, op, false); - return FilterBuilders.rangeFilter(name).gt(value); + return QueryBuilders.rangeQuery(name).gt(value); case "greaterThanOrEqualTo": checkRequiredValue(value, name, op, false); - return FilterBuilders.rangeFilter(name).gte(value); + return QueryBuilders.rangeQuery(name).gte(value); case "lessThan": checkRequiredValue(value, name, op, false); - return FilterBuilders.rangeFilter(name).lt(value); + return QueryBuilders.rangeQuery(name).lt(value); case "lessThanOrEqualTo": checkRequiredValue(value, name, op, false); - return FilterBuilders.rangeFilter(name).lte(value); + return QueryBuilders.rangeQuery(name).lte(value); case "between": checkRequiredValuesSize(values, name, op, 2); - return FilterBuilders.rangeFilter(name).gte(values.get(0)).lte(values.get(1)); + return QueryBuilders.rangeQuery(name).gte(values.get(0)).lte(values.get(1)); case "exists": - return FilterBuilders.existsFilter(name); + return QueryBuilders.existsQuery(name); case "missing": - return FilterBuilders.missingFilter(name); + return QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery((name))); case "contains": checkRequiredValue(expectedValue, name, op, false); - return FilterBuilders.regexpFilter(name, ".*" + expectedValue + ".*"); + return QueryBuilders.regexpQuery(name, ".*" + expectedValue + ".*"); case "startsWith": checkRequiredValue(expectedValue, name, op, false); - return FilterBuilders.prefixFilter(name, expectedValue); + return QueryBuilders.prefixQuery(name, expectedValue); case "endsWith": checkRequiredValue(expectedValue, name, op, false); - return FilterBuilders.regexpFilter(name, ".*" + expectedValue); + return QueryBuilders.regexpQuery(name, ".*" + expectedValue); case "matchesRegex": checkRequiredValue(expectedValue, name, op, false); - return FilterBuilders.regexpFilter(name, expectedValue); + return QueryBuilders.regexpQuery(name, expectedValue); case "in": checkRequiredValue(values, name, op, true); - return FilterBuilders.inFilter(name, values.toArray()); + return QueryBuilders.termsQuery(name, values.toArray()); case "notIn": checkRequiredValue(values, name, op, true); - return FilterBuilders.notFilter(FilterBuilders.inFilter(name, values.toArray())); + return QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(name, values.toArray())); case "all": checkRequiredValue(values, name, op, true); - return FilterBuilders.termsFilter(name, values.toArray()).execution("and"); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + for (Object curValue : values) { + boolQueryBuilder.must(QueryBuilders.termQuery(name, curValue)); + } + return boolQueryBuilder; case "isDay": checkRequiredValue(value, name, op, false); return getIsSameDayRange(value, name); case "isNotDay": checkRequiredValue(value, name, op, false); - return FilterBuilders.notFilter(getIsSameDayRange(value, name)); + return QueryBuilders.boolQuery().mustNot(getIsSameDayRange(value, name)); } return null; } @@ -126,10 +131,10 @@ public class PropertyConditionESQueryBuilder implements ConditionESQueryBuilder } } - private FilterBuilder getIsSameDayRange (Object value, String name) { + private QueryBuilder getIsSameDayRange (Object value, String name) { DateTime date = new DateTime(value); DateTime dayStart = date.withTimeAtStartOfDay(); DateTime dayAfterStart = date.plusDays(1).withTimeAtStartOfDay(); - return FilterBuilders.rangeFilter(name).gte(dayStart.toDate()).lte(dayAfterStart.toDate()); + return QueryBuilders.rangeQuery(name).gte(dayStart.toDate()).lte(dayAfterStart.toDate()); } } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java index ca3e512..e0c5e61 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java @@ -41,7 +41,6 @@ import org.slf4j.LoggerFactory; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; /** @@ -271,7 +270,7 @@ public class PropertyConditionEvaluator implements ConditionEvaluator { if (value instanceof Date) { return ((Date) value); } else { - DateMathParser parser = new DateMathParser(DateFieldMapper.Defaults.DATE_TIME_FORMATTER, TimeUnit.MILLISECONDS); + DateMathParser parser = new DateMathParser(DateFieldMapper.Defaults.DATE_TIME_FORMATTER); try { return new Date(parser.parse(value.toString(), new Callable<Long>() { @Override http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/SourceEventPropertyConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/SourceEventPropertyConditionESQueryBuilder.java b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/SourceEventPropertyConditionESQueryBuilder.java index 68e5944..7ba6c6f 100644 --- a/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/SourceEventPropertyConditionESQueryBuilder.java +++ b/plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/SourceEventPropertyConditionESQueryBuilder.java @@ -20,8 +20,9 @@ package org.apache.unomi.plugins.baseplugin.conditions; import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import java.util.ArrayList; import java.util.List; @@ -32,21 +33,29 @@ public class SourceEventPropertyConditionESQueryBuilder implements ConditionESQu public SourceEventPropertyConditionESQueryBuilder() { } - private void appendFilderIfPropExist(List<FilterBuilder> filterBuilders, Condition condition, String prop){ + private void appendFilderIfPropExist(List<QueryBuilder> queryBuilders, Condition condition, String prop){ final Object parameter = condition.getParameter(prop); if (parameter != null && !"".equals(parameter)) { - filterBuilders.add(FilterBuilders.termFilter("source." + prop, (String) parameter)); + queryBuilders.add(QueryBuilders.termQuery("source." + prop, (String) parameter)); } } - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { - List<FilterBuilder> l = new ArrayList<FilterBuilder>(); + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + List<QueryBuilder> queryBuilders = new ArrayList<QueryBuilder>(); for (String prop : new String[]{"id", "path", "scope", "type"}){ - appendFilderIfPropExist(l, condition, prop); + appendFilderIfPropExist(queryBuilders, condition, prop); } - if (l.size() >= 1) { - return l.size() == 1 ? l.get(0) : FilterBuilders.andFilter(l.toArray(new FilterBuilder[l.size()])); + if (queryBuilders.size() >= 1) { + if (queryBuilders.size() == 1) { + return queryBuilders.get(0); + } else { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + for (QueryBuilder queryBuilder : queryBuilders) { + boolQueryBuilder.must(queryBuilder); + } + return boolQueryBuilder; + } } else { return null; } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/plugins/hover-event/src/main/java/org/apache/unomi/plugins/events/hover/querybuilders/HoverEventConditionESQueryBuilder.java ---------------------------------------------------------------------- diff --git a/plugins/hover-event/src/main/java/org/apache/unomi/plugins/events/hover/querybuilders/HoverEventConditionESQueryBuilder.java b/plugins/hover-event/src/main/java/org/apache/unomi/plugins/events/hover/querybuilders/HoverEventConditionESQueryBuilder.java index 201b834..978edef 100644 --- a/plugins/hover-event/src/main/java/org/apache/unomi/plugins/events/hover/querybuilders/HoverEventConditionESQueryBuilder.java +++ b/plugins/hover-event/src/main/java/org/apache/unomi/plugins/events/hover/querybuilders/HoverEventConditionESQueryBuilder.java @@ -20,8 +20,9 @@ package org.apache.unomi.plugins.events.hover.querybuilders; import org.apache.unomi.api.conditions.Condition; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilder; import org.apache.unomi.persistence.elasticsearch.conditions.ConditionESQueryBuilderDispatcher; -import org.elasticsearch.index.query.FilterBuilder; -import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import java.util.ArrayList; import java.util.List; @@ -35,19 +36,23 @@ public class HoverEventConditionESQueryBuilder implements ConditionESQueryBuilde public HoverEventConditionESQueryBuilder() { } - public FilterBuilder buildFilter(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { - List<FilterBuilder> filters = new ArrayList<FilterBuilder>(); - filters.add(FilterBuilders.termFilter("eventType", "hover")); + public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { + List<QueryBuilder> queryBuilders = new ArrayList<QueryBuilder>(); + queryBuilders.add(QueryBuilders.termQuery("eventType", "hover")); String targetId = (String) condition.getParameter("targetId"); String targetPath = (String) condition.getParameter("targetPath"); if (targetId != null && targetId.trim().length() > 0) { - filters.add(FilterBuilders.termFilter("target.itemId", targetId)); + queryBuilders.add(QueryBuilders.termQuery("target.itemId", targetId)); } else if (targetPath != null && targetPath.trim().length() > 0) { - filters.add(FilterBuilders.termFilter("target.properties.pageInfo.pagePath", targetPath)); + queryBuilders.add(QueryBuilders.termQuery("target.properties.pageInfo.pagePath", targetPath)); } else { - filters.add(FilterBuilders.termFilter("target.itemId", "")); + queryBuilders.add(QueryBuilders.termQuery("target.itemId", "")); } - return FilterBuilders.andFilter(filters.toArray(new FilterBuilder[filters.size()])); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + for (QueryBuilder queryBuilder : queryBuilders) { + boolQueryBuilder.must(queryBuilder); + } + return boolQueryBuilder; } } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/131a06aa/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index db4e1dd..a94c0a0 100644 --- a/pom.xml +++ b/pom.xml @@ -65,11 +65,11 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <cxf.version>2.7.11</cxf.version> - <version.jackson.core>2.4.0</version.jackson.core> <!-- version used by CXF --> - <version.jackson.jaxb>2.4.0</version.jackson.jaxb> <!-- version used by CXF --> + <version.jackson.core>2.6.6</version.jackson.core> <!-- version used by CXF --> + <version.jackson.jaxb>2.6.6</version.jackson.jaxb> <!-- version used by CXF --> <version.karaf>3.0.2</version.karaf> - <version.pax.exam>4.4.0</version.pax.exam> - <elasticsearch.version>1.6.2</elasticsearch.version> + <version.pax.exam>4.9.1</version.pax.exam> + <elasticsearch.version>2.3.4</elasticsearch.version> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target>
