/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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.elasticsearch.common.xcontent.support.filtering; import org.elasticsearch.common.util.set.Sets; import org.elasticsearch.test.ESTestCase; import java.util.Set; import static java.util.Collections.singleton; import static org.hamcrest.Matchers.arrayWithSize; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; public class FilterPathTests extends ESTestCase { public void testSimpleFilterPath() { final String input = "test"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("test")); FilterPath next = filterPath.getNext(); assertNotNull(next); assertThat(next.matches(), is(true)); assertThat(next.getSegment(), isEmptyString()); assertSame(next, FilterPath.EMPTY); } public void testFilterPathWithSubField() { final String input = "foo.bar"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("foo")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("bar")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); } public void testFilterPathWithSubFields() { final String input = "foo.bar.quz"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("foo")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("bar")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("quz")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); } public void testEmptyFilterPath() { FilterPath[] filterPaths = FilterPath.compile(singleton("")); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(0)); } public void testNullFilterPath() { FilterPath[] filterPaths = FilterPath.compile(singleton(null)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(0)); } public void testFilterPathWithEscapedDots() { String input = "w.0.0.t"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("w")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("0")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("0")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("t")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); input = "w\\.0\\.0\\.t"; filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("w.0.0.t")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); input = "w\\.0.0\\.t"; filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); filterPath = filterPaths[0]; assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("w.0")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("0.t")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); } public void testSimpleWildcardFilterPath() { FilterPath[] filterPaths = FilterPath.compile(singleton("*")); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.isSimpleWildcard(), is(true)); assertThat(filterPath.getSegment(), equalTo("*")); FilterPath next = filterPath.matchProperty(randomAlphaOfLength(2)); assertNotNull(next); assertSame(next, FilterPath.EMPTY); } public void testWildcardInNameFilterPath() { String input = "f*o.bar"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("f*o")); assertThat(filterPath.matchProperty("foo"), notNullValue()); assertThat(filterPath.matchProperty("flo"), notNullValue()); assertThat(filterPath.matchProperty("foooo"), notNullValue()); assertThat(filterPath.matchProperty("boo"), nullValue()); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("bar")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); } public void testDoubleWildcardFilterPath() { FilterPath[] filterPaths = FilterPath.compile(singleton("**")); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.isDoubleWildcard(), is(true)); assertThat(filterPath.getSegment(), equalTo("**")); FilterPath next = filterPath.matchProperty(randomAlphaOfLength(2)); assertNotNull(next); assertSame(next, FilterPath.EMPTY); } public void testStartsWithDoubleWildcardFilterPath() { String input = "**.bar"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("**")); FilterPath next = filterPath.matchProperty(randomAlphaOfLength(2)); assertNotNull(next); assertThat(next.matches(), is(false)); assertThat(next.getSegment(), equalTo("bar")); next = next.getNext(); assertNotNull(next); assertThat(next.matches(), is(true)); assertThat(next.getSegment(), isEmptyString()); assertSame(next, FilterPath.EMPTY); } public void testContainsDoubleWildcardFilterPath() { String input = "foo.**.bar"; FilterPath[] filterPaths = FilterPath.compile(singleton(input)); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(1)); FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("foo")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.isDoubleWildcard(), equalTo(true)); assertThat(filterPath.getSegment(), equalTo("**")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("bar")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); } public void testMultipleFilterPaths() { Set<String> inputs = Sets.newHashSet("foo.**.bar.*", "test.dot\\.ted"); FilterPath[] filterPaths = FilterPath.compile(inputs); assertNotNull(filterPaths); assertThat(filterPaths, arrayWithSize(2)); // foo.**.bar.* FilterPath filterPath = filterPaths[0]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("foo")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.isDoubleWildcard(), equalTo(true)); assertThat(filterPath.getSegment(), equalTo("**")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("bar")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.isSimpleWildcard(), equalTo(true)); assertThat(filterPath.getSegment(), equalTo("*")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); // test.dot\.ted filterPath = filterPaths[1]; assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("test")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(false)); assertThat(filterPath.getSegment(), equalTo("dot.ted")); filterPath = filterPath.getNext(); assertNotNull(filterPath); assertThat(filterPath.matches(), is(true)); assertThat(filterPath.getSegment(), isEmptyString()); assertSame(filterPath, FilterPath.EMPTY); } }