| /* |
| * 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 java.lang.invoke.MethodHandles; |
| import java.sql.Connection; |
| import java.sql.Statement; |
| import java.util.Locale; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import junit.framework.Assert; |
| |
| import org.apache.solr.request.SolrQueryRequest; |
| import org.junit.Test; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| public class TestVariableResolverEndToEnd extends AbstractDIHJdbcTestCase { |
| |
| private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); |
| |
| @Test |
| public void test() throws Exception { |
| h.query("/dataimport", generateRequest()); |
| SolrQueryRequest req = null; |
| try { |
| req = req("q", "*:*", "wt", "json", "indent", "true"); |
| String response = h.query(req); |
| log.debug(response); |
| response = response.replaceAll("\\s",""); |
| Assert.assertTrue(response.contains("\"numFound\":1")); |
| Pattern p = Pattern.compile("[\"]second1_s[\"][:][\"](.*?)[\"]"); |
| Matcher m = p.matcher(response); |
| Assert.assertTrue(m.find()); |
| String yearStr = m.group(1); |
| Assert.assertTrue(response.contains("\"second1_s\":\"" + yearStr + "\"")); |
| Assert.assertTrue(response.contains("\"second2_s\":\"" + yearStr + "\"")); |
| Assert.assertTrue(response.contains("\"second3_s\":\"" + yearStr + "\"")); |
| Assert.assertTrue(response.contains("\"PORK_s\":\"GRILL\"")); |
| Assert.assertTrue(response.contains("\"FISH_s\":\"FRY\"")); |
| Assert.assertTrue(response.contains("\"BEEF_CUTS_mult_s\":[\"ROUND\",\"SIRLOIN\"]")); |
| } catch(Exception e) { |
| throw e; |
| } finally { |
| req.close(); |
| } |
| } |
| |
| @Override |
| protected String generateConfig() { |
| String thirdLocaleParam = random().nextBoolean() ? "" : (", '" + Locale.getDefault().toLanguageTag() + "'"); |
| StringBuilder sb = new StringBuilder(); |
| sb.append("<dataConfig> \n"); |
| sb.append("<dataSource name=\"hsqldb\" driver=\"${dataimporter.request.dots.in.hsqldb.driver}\" url=\"jdbc:hsqldb:mem:.\" /> \n"); |
| sb.append("<document name=\"TestEvaluators\"> \n"); |
| sb.append("<entity name=\"FIRST\" processor=\"SqlEntityProcessor\" dataSource=\"hsqldb\" "); |
| sb.append(" query=\"" + |
| "select " + |
| " 1 as id, " + |
| " 'SELECT' as SELECT_KEYWORD, " + |
| " {ts '2017-02-18 12:34:56'} as FIRST_TS " + |
| "from DUAL \" >\n"); |
| sb.append(" <field column=\"SELECT_KEYWORD\" name=\"select_keyword_s\" /> \n"); |
| sb.append(" <entity name=\"SECOND\" processor=\"SqlEntityProcessor\" dataSource=\"hsqldb\" transformer=\"TemplateTransformer\" "); |
| sb.append(" query=\"" + |
| "${dataimporter.functions.encodeUrl(FIRST.SELECT_KEYWORD)} " + |
| " 1 as SORT, " + |
| " {ts '2017-02-18 12:34:56'} as SECOND_TS, " + |
| " '${dataimporter.functions.formatDate(FIRST.FIRST_TS, 'yyyy'" + thirdLocaleParam + ")}' as SECOND1_S, " + |
| " 'PORK' AS MEAT, " + |
| " 'GRILL' AS METHOD, " + |
| " 'ROUND' AS CUTS, " + |
| " 'BEEF_CUTS' AS WHATKIND " + |
| "from DUAL " + |
| "WHERE 1=${FIRST.ID} " + |
| "UNION " + |
| "${dataimporter.functions.encodeUrl(FIRST.SELECT_KEYWORD)} " + |
| " 2 as SORT, " + |
| " {ts '2017-02-18 12:34:56'} as SECOND_TS, " + |
| " '${dataimporter.functions.formatDate(FIRST.FIRST_TS, 'yyyy'" + thirdLocaleParam + ")}' as SECOND1_S, " + |
| " 'FISH' AS MEAT, " + |
| " 'FRY' AS METHOD, " + |
| " 'SIRLOIN' AS CUTS, " + |
| " 'BEEF_CUTS' AS WHATKIND " + |
| "from DUAL " + |
| "WHERE 1=${FIRST.ID} " + |
| "ORDER BY SORT \"" + |
| ">\n"); |
| sb.append(" <field column=\"SECOND_S\" name=\"second_s\" /> \n"); |
| sb.append(" <field column=\"SECOND1_S\" name=\"second1_s\" /> \n"); |
| sb.append(" <field column=\"second2_s\" template=\"${dataimporter.functions.formatDate(SECOND.SECOND_TS, 'yyyy'" + thirdLocaleParam + ")}\" /> \n"); |
| sb.append(" <field column=\"second3_s\" template=\"${dih.functions.formatDate(SECOND.SECOND_TS, 'yyyy'" + thirdLocaleParam + ")}\" /> \n"); |
| sb.append(" <field column=\"METHOD\" name=\"${SECOND.MEAT}_s\"/>\n"); |
| sb.append(" <field column=\"CUTS\" name=\"${SECOND.WHATKIND}_mult_s\"/>\n"); |
| sb.append(" </entity>\n"); |
| sb.append("</entity>\n"); |
| sb.append("</document> \n"); |
| sb.append("</dataConfig> \n"); |
| String config = sb.toString(); |
| log.info(config); |
| return config; |
| } |
| @Override |
| protected void populateData(Connection conn) throws Exception { |
| Statement s = null; |
| try { |
| s = conn.createStatement(); |
| s.executeUpdate("create table dual(dual char(1) not null)"); |
| s.executeUpdate("insert into dual values('Y')"); |
| conn.commit(); |
| } catch (Exception e) { |
| throw e; |
| } finally { |
| try { |
| s.close(); |
| } catch (Exception ex) {} |
| try { |
| conn.close(); |
| } catch (Exception ex) {} |
| } |
| } |
| @Override |
| protected Database setAllowedDatabases() { |
| return Database.HSQLDB; |
| } |
| } |