blob: 986a8cdc60bc49343ebac290d2ed5a1c64995444 [file] [log] [blame]
/*
* 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.solr.handler.dataimport;
import org.junit.Before;
import org.junit.Test;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* <p> Test for Evaluators </p>
*
*
* @since solr 1.3
*/
public class TestBuiltInEvaluators extends AbstractDataImportHandlerTestCase {
private static final String ENCODING = StandardCharsets.UTF_8.name();
VariableResolver resolver;
Map<String, String> sqlTests;
Map<String, String> urlTests;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
resolver = new VariableResolver();
sqlTests = new HashMap<>();
sqlTests.put("foo\"", "foo\"\"");
sqlTests.put("foo\\", "foo\\\\");
sqlTests.put("foo'", "foo''");
sqlTests.put("foo''", "foo''''");
sqlTests.put("'foo\"", "''foo\"\"");
sqlTests.put("\"Albert D'souza\"", "\"\"Albert D''souza\"\"");
urlTests = new HashMap<>();
urlTests.put("*:*", URLEncoder.encode("*:*", ENCODING));
urlTests.put("price:[* TO 200]", URLEncoder.encode("price:[* TO 200]",
ENCODING));
urlTests.put("review:\"hybrid sedan\"", URLEncoder.encode(
"review:\"hybrid sedan\"", ENCODING));
}
@Test
public void testSqlEscapingEvaluator() {
Evaluator sqlEscaper = new SqlEscapingEvaluator();
runTests(sqlTests, sqlEscaper);
}
@Test
public void testUrlEvaluator() throws Exception {
Evaluator urlEvaluator = new UrlEvaluator();
runTests(urlTests, urlEvaluator);
}
@Test
public void parseParams() {
Map<String,Object> m = new HashMap<>();
m.put("b","B");
VariableResolver vr = new VariableResolver();
vr.addNamespace("a",m);
List<Object> l = (new Evaluator() {
@Override
public String evaluate(String expression, Context context) {
return null;
}
}).parseParams(" 1 , a.b, 'hello!', 'ds,o,u\'za',",vr);
assertEquals(1d,l.get(0));
assertEquals("B",((Evaluator.VariableWrapper)l.get(1)).resolve());
assertEquals("hello!",l.get(2));
assertEquals("ds,o,u'za",l.get(3));
}
@Test
public void testEscapeSolrQueryFunction() {
final VariableResolver resolver = new VariableResolver();
Map<String,Object> m= new HashMap<>();
m.put("query","c:t");
resolver.setEvaluators(new DataImporter().getEvaluators(Collections.<Map<String,String>>emptyList()));
resolver.addNamespace("e",m);
String s = resolver
.replaceTokens("${dataimporter.functions.escapeQueryChars(e.query)}");
org.junit.Assert.assertEquals("c\\:t", s);
}
private Date twoDaysAgo(Locale l, TimeZone tz) {
Calendar calendar = Calendar.getInstance(tz, l);
calendar.add(Calendar.DAY_OF_YEAR, -2);
return calendar.getTime();
}
@Test
public void testDateFormatEvaluator() {
Evaluator dateFormatEval = new DateFormatEvaluator();
ContextImpl context = new ContextImpl(null, resolver, null,
Context.FULL_DUMP, Collections.<String,Object> emptyMap(), null, null);
Locale rootLocale = Locale.ROOT;
Locale defaultLocale = Locale.getDefault();
TimeZone defaultTz = TimeZone.getDefault();
{
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH", rootLocale);
String sdf = sdfDate.format(twoDaysAgo(rootLocale, defaultTz));
String dfe = dateFormatEval.evaluate("'NOW-2DAYS','yyyy-MM-dd HH'", context);
assertEquals(sdf,dfe);
}
{
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH", defaultLocale);
String sdf = sdfDate.format(twoDaysAgo(defaultLocale, TimeZone.getDefault()));
String dfe = dateFormatEval.evaluate(
"'NOW-2DAYS','yyyy-MM-dd HH','" + defaultLocale.toLanguageTag() + "'", context);
assertEquals(sdf,dfe);
for(String tzStr : TimeZone.getAvailableIDs()) {
TimeZone tz = TimeZone.getTimeZone(tzStr);
sdfDate.setTimeZone(tz);
sdf = sdfDate.format(twoDaysAgo(defaultLocale, tz));
dfe = dateFormatEval.evaluate(
"'NOW-2DAYS','yyyy-MM-dd HH','" + defaultLocale.toLanguageTag() + "','" + tzStr + "'", context);
assertEquals(sdf,dfe);
}
}
Date d = new Date();
Map<String,Object> map = new HashMap<>();
map.put("key", d);
resolver.addNamespace("A", map);
assertEquals(
new SimpleDateFormat("yyyy-MM-dd HH:mm", rootLocale).format(d),
dateFormatEval.evaluate("A.key, 'yyyy-MM-dd HH:mm'", context));
assertEquals(
new SimpleDateFormat("yyyy-MM-dd HH:mm", defaultLocale).format(d),
dateFormatEval.evaluate("A.key, 'yyyy-MM-dd HH:mm','" + defaultLocale.toLanguageTag() + "'", context));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", defaultLocale);
for(String tzStr : TimeZone.getAvailableIDs()) {
TimeZone tz = TimeZone.getTimeZone(tzStr);
sdf.setTimeZone(tz);
assertEquals(
sdf.format(d),
dateFormatEval.evaluate(
"A.key, 'yyyy-MM-dd HH:mm','" + defaultLocale.toLanguageTag() + "', '" + tzStr + "'", context));
}
}
private void runTests(Map<String, String> tests, Evaluator evaluator) {
ContextImpl ctx = new ContextImpl(null, resolver, null, Context.FULL_DUMP, Collections.<String, Object>emptyMap(), null, null);
for (Map.Entry<String, String> entry : tests.entrySet()) {
Map<String, Object> values = new HashMap<>();
values.put("key", entry.getKey());
resolver.addNamespace("A", values);
String expected = entry.getValue();
String actual = evaluator.evaluate("A.key", ctx);
assertEquals(expected, actual);
}
}
}