/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2006-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.filter.text.cql2;
import org.geotools.filter.text.commons.CompilerUtil;
import org.geotools.filter.text.commons.Language;
import org.junit.Assert;
import org.junit.Test;
import org.opengis.filter.PropertyIsLike;
import org.opengis.filter.expression.PropertyName;
/**
* Test Attribute
* <p>
*
* <pre>
* <attribute name > ::=
* <simple attribute name >
* | <compound attribute name >
*
* <simple attribute name > ::= <identifier>| <double quote> <any character> <double quote>
*
* <compound attribute name > ::= <identifier > <period > [{ <identifier > <period >}...] <simple attribute name >
*
* <identifier > ::= <identifier start > [ { <colon > | <identifier part > }... ]
* <identifier start > ::= <simple Latin letter >
* <identifier part > ::= <simple Latin letter > | <digit >
* </pre>
*
* @author Mauricio Pazos (Axios Engineering)
* @since 2.7
*
*
* @source $URL: http://svn.osgeo.org/geotools/branches/2.7.x/build/maven/javadoc/../../../modules/library/cql/src/test/java/org/geotools/filter/text/cql2/CQLAttributeNameTest.java $
* </p>
*/
public class CQLAttributeNameTest {
protected final Language language;
public CQLAttributeNameTest(){
this(Language.CQL);
}
public CQLAttributeNameTest(final Language language){
assert language != null: "language cannot be null value";
this.language = language;
}
@Test
public void simpleAttribute() throws CQLException {
testAttribute("startPart");
}
@Test
public void simpleAttribureWithColon() throws CQLException {
testAttribute("startpart:part1:part2");
}
@Test
public void compoundAttributeName() throws CQLException {
testAttribute("s11:p12:p13.s21:p22.s31:p32");
testAttribute(
"gmd:MD_Metadata.gmd:identificationInfo.gmd:MD_DataIdentification.gmd:abstract");
}
/**
* Invalid attribute names
* @throws CQLException
*/
@Test(expected = CQLException.class)
public void invalidAttribute() throws CQLException {
//Invalid Attribute is expected: the identifier can not begin with number.
testAttribute("1startPart");
//Invalid Attribute is expected: the compound attribute should have \":\"
testAttribute("startpart part1");
}
/**
* Using a CQL Keyword as property name
*
*
* @throws Exception
*/
@Test
public void keywordAsAttribute() throws CQLException {
testAttributeBetweenDoubleQuotes("\"LIKE\"");
testAttributeBetweenDoubleQuotes("\"AND\"");
testAttributeBetweenDoubleQuotes("\"OR\"");
}
/**
* Using different local characters as property name.
*
*
* @throws Exception
*/
@Test
public void localCharactersetInAttributeName() throws CQLException {
testAttributeBetweenDoubleQuotes("\"población\"");
testAttributeBetweenDoubleQuotes("\"reconnaître\"");
testAttributeBetweenDoubleQuotes("\"können\"");
// Russian
testAttributeBetweenDoubleQuotes("\"ДОБРИЧ\"");
testAttributeBetweenDoubleQuotes("\"название\"");
testAttributeBetweenDoubleQuotes("\"фамилия\"");
testAttributeBetweenDoubleQuotes("\"среды\"");
// Japanese
testAttributeBetweenDoubleQuotes("\"名\"");
testAttributeBetweenDoubleQuotes("\"姓\"");
testAttributeBetweenDoubleQuotes("\"環境\"");
}
private void testAttributeBetweenDoubleQuotes(final String attSample) throws CQLException {
PropertyIsLike result;
PropertyName attResult = null;
result = (PropertyIsLike) CompilerUtil.parseFilter(this.language, attSample + " LIKE 'abc%'");
attResult = (PropertyName) result.getExpression();
String expected = attSample.replace('.', '/');
expected = expected.substring(1, expected.length()-1);
String propertyName = attResult.getPropertyName();
Assert.assertEquals(expected, propertyName);
}
private void testAttribute(final String attSample) throws CQLException {
PropertyIsLike result;
PropertyName attResult = null;
result = (PropertyIsLike) CompilerUtil.parseFilter(this.language, attSample + " LIKE 'abc%'");
attResult = (PropertyName) result.getExpression();
final String expected = attSample.replace('.', '/');
Assert.assertEquals(expected, attResult.getPropertyName());
}
}