Selaa lähdekoodia

Merge branch '5.x'

chennan 8 vuotta sitten
vanhempi
commit
bc5b491b40

+ 3 - 3
src/main/java/org/es/sql/bean/ElasticDslContext.java

@@ -6,17 +6,17 @@ public class ElasticDslContext {
     //SQL
     private SQLQueryExpr queryExpr;
     //SQL Args
-    private SQLArgs SQLArgs;
+    private org.es.sql.bean.SQLArgs SQLArgs;
     //Result
     private ElasticSqlParseResult parseResult;
 
-    public ElasticDslContext(SQLQueryExpr queryExpr, SQLArgs SQLArgs) {
+    public ElasticDslContext(SQLQueryExpr queryExpr, org.es.sql.bean.SQLArgs SQLArgs) {
         this.queryExpr = queryExpr;
         this.SQLArgs = SQLArgs;
         parseResult = new ElasticSqlParseResult();
     }
 
-    public SQLArgs getSQLArgs() {
+    public org.es.sql.bean.SQLArgs getSQLArgs() {
         return SQLArgs;
     }
 

src/main/java/org/es/sql/bean/SqlArgs.java → src/main/java/org/es/sql/bean/SQLArgs.java


+ 7 - 2
src/main/java/org/es/sql/parser/ElasticSql2DslParser.java

@@ -45,14 +45,19 @@ public class ElasticSql2DslParser {
             throw new ElasticSql2DslException(ex);
         }
 
-        final ElasticDslContext elasticDslContext = new ElasticDslContext(queryExpr, new SQLArgs(sqlArgs));
+        SQLArgs sqlParamValues = null;
+        if (sqlArgs != null && sqlArgs.length > 0) {
+            sqlParamValues = new SQLArgs(sqlArgs);
+        }
+
+        ElasticDslContext elasticDslContext = new ElasticDslContext(queryExpr, sqlParamValues);
         if (queryExpr.getSubQuery().getQuery() instanceof ElasticSqlSelectQueryBlock) {
             for (QueryParser sqlParser : buildSqlParserChain(parseActionListener)) {
                 sqlParser.parse(elasticDslContext);
             }
         }
         else {
-            throw new ElasticSql2DslException("[syntax error] Sql only support Select Sql");
+            throw new ElasticSql2DslException("[syntax error] only support Select Sql");
         }
         return elasticDslContext.getParseResult();
     }

+ 3 - 4
src/main/java/org/es/sql/parser/query/method/MethodInvocation.java

@@ -2,7 +2,6 @@ package org.es.sql.parser.query.method;
 
 import com.alibaba.druid.sql.ast.SQLExpr;
 import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
-import org.es.sql.bean.SQLArgs;
 import org.es.sql.helper.ElasticSqlArgConverter;
 
 import java.util.List;
@@ -10,9 +9,9 @@ import java.util.List;
 public class MethodInvocation {
     private final SQLMethodInvokeExpr methodInvokeExpr;
     private final String queryAs;
-    private final SQLArgs SQLArgs;
+    private final org.es.sql.bean.SQLArgs SQLArgs;
 
-    public MethodInvocation(SQLMethodInvokeExpr methodInvokeExpr, String queryAs, SQLArgs SQLArgs) {
+    public MethodInvocation(SQLMethodInvokeExpr methodInvokeExpr, String queryAs, org.es.sql.bean.SQLArgs SQLArgs) {
         if (methodInvokeExpr == null) {
             throw new IllegalArgumentException("method invoke expression can not be null");
         }
@@ -25,7 +24,7 @@ public class MethodInvocation {
         return queryAs;
     }
 
-    public SQLArgs getSQLArgs() {
+    public org.es.sql.bean.SQLArgs getSQLArgs() {
         return SQLArgs;
     }
 

+ 61 - 60
src/main/java/org/es/sql/parser/query/method/script/ScriptAtomQueryParser.java

@@ -1,60 +1,61 @@
-//package org.es.sql.parser.query.method.script;
-//
-//import com.google.common.collect.ImmutableList;
-//import org.apache.commons.collections.MapUtils;
-//import org.apache.commons.lang.StringUtils;
-//import org.elasticsearch.index.query.QueryBuilders;
-//import org.elasticsearch.script.Script;
-//import org.elasticsearch.script.ScriptService;
-//import org.es.sql.bean.AtomQuery;
-//import org.es.sql.exception.ElasticSql2DslException;
-//import org.es.sql.parser.query.method.MethodInvocation;
-//import org.es.sql.parser.query.method.ParameterizedMethodQueryParser;
-//
-//import java.util.List;
-//import java.util.Map;
-//
-//public class ScriptAtomQueryParser extends ParameterizedMethodQueryParser {
-//
-//    private static List<String> SCRIPT_METHOD = ImmutableList.of("script_query", "scriptQuery");
-//
-//    @Override
-//    public List<String> defineMethodNames() {
-//        return SCRIPT_METHOD;
-//    }
-//
-//    @Override
-//    protected String defineExtraParamString(MethodInvocation invocation) {
-//        int extraParamIdx = 1;
-//
-//        return (invocation.getParameterCount() == extraParamIdx + 1)
-//                ? invocation.getParameterAsString(extraParamIdx) : StringUtils.EMPTY;
-//    }
-//
-//    @Override
-//    public void checkMethodInvocation(MethodInvocation invocation) throws ElasticSql2DslException {
-//        if (invocation.getParameterCount() != 1 && invocation.getParameterCount() != 2) {
-//            throw new ElasticSql2DslException(
-//                    String.format("[syntax error] There's no %s args method named [%s].",
-//                            invocation.getParameterCount(), invocation.getMethodName()));
-//        }
-//
-//        String script = invocation.getParameterAsString(0);
-//        if (StringUtils.isEmpty(script)) {
-//            throw new ElasticSql2DslException("[syntax error] Script can not be blank!");
-//        }
-//    }
-//
-//    @Override
-//    protected AtomQuery parseMethodQueryWithExtraParams(MethodInvocation invocation, Map<String, String> extraParamMap) throws ElasticSql2DslException {
-//        String script = invocation.getParameterAsString(0);
-//
-//        if (MapUtils.isNotEmpty(extraParamMap)) {
-//            Map<String, Object> scriptParamMap = generateRawTypeParameterMap(invocation);
-//            return new AtomQuery(QueryBuilders.scriptQuery(new Script(script, ScriptService.ScriptType.INLINE, null, scriptParamMap)));
-//        }
-//        return new AtomQuery(QueryBuilders.scriptQuery(new Script(script)));
-//    }
-//
-//
-//}
+package org.es.sql.parser.query.method.script;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.script.Script;
+import org.es.sql.bean.AtomQuery;
+import org.es.sql.exception.ElasticSql2DslException;
+import org.es.sql.parser.query.method.MethodInvocation;
+import org.es.sql.parser.query.method.ParameterizedMethodQueryParser;
+
+import java.util.List;
+import java.util.Map;
+
+public class ScriptAtomQueryParser extends ParameterizedMethodQueryParser {
+
+    private static List<String> SCRIPT_METHOD = ImmutableList.of("script_query", "scriptQuery");
+
+    @Override
+    public List<String> defineMethodNames() {
+        return SCRIPT_METHOD;
+    }
+
+    @Override
+    protected String defineExtraParamString(MethodInvocation invocation) {
+        int extraParamIdx = 1;
+
+        return (invocation.getParameterCount() == extraParamIdx + 1)
+                ? invocation.getParameterAsString(extraParamIdx) : StringUtils.EMPTY;
+    }
+
+    @Override
+    public void checkMethodInvocation(MethodInvocation invocation) throws ElasticSql2DslException {
+        if (invocation.getParameterCount() != 1 && invocation.getParameterCount() != 2) {
+            throw new ElasticSql2DslException(
+                    String.format("[syntax error] There's no %s args method named [%s].",
+                            invocation.getParameterCount(), invocation.getMethodName()));
+        }
+
+        String script = invocation.getParameterAsString(0);
+        if (StringUtils.isEmpty(script)) {
+            throw new ElasticSql2DslException("[syntax error] Script can not be blank!");
+        }
+    }
+
+    @Override
+    protected AtomQuery parseMethodQueryWithExtraParams(MethodInvocation invocation, Map<String, String> extraParamMap) throws ElasticSql2DslException {
+        String script = invocation.getParameterAsString(0);
+
+        if (MapUtils.isNotEmpty(extraParamMap)) {
+            Map<String, Object> scriptParamMap = generateRawTypeParameterMap(invocation);
+            Script scriptObject = new Script(Script.DEFAULT_SCRIPT_TYPE, Script.DEFAULT_SCRIPT_LANG, script, scriptParamMap);
+
+            return new AtomQuery(QueryBuilders.scriptQuery(scriptObject));
+        }
+        return new AtomQuery(QueryBuilders.scriptQuery(new Script(script)));
+    }
+
+
+}

+ 7 - 8
src/main/java/org/es/sql/parser/sql/AbstractQueryConditionParser.java

@@ -10,8 +10,8 @@ import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.es.sql.bean.AtomQuery;
-import org.es.sql.bean.SQLCondition;
 import org.es.sql.bean.SQLArgs;
+import org.es.sql.bean.SQLCondition;
 import org.es.sql.enums.SQLBoolOperator;
 import org.es.sql.enums.SQLConditionType;
 import org.es.sql.exception.ElasticSql2DslException;
@@ -21,16 +21,15 @@ import org.es.sql.parser.query.exact.BinaryAtomQueryParser;
 import org.es.sql.parser.query.exact.InListAtomQueryParser;
 import org.es.sql.parser.query.method.MethodInvocation;
 import org.es.sql.parser.query.method.fulltext.FullTextAtomQueryParser;
+import org.es.sql.parser.query.method.script.ScriptAtomQueryParser;
 import org.es.sql.parser.query.method.term.TermLevelAtomQueryParser;
 
 import java.util.List;
 
-//import org.es.sql.parser.query.method.script.ScriptAtomQueryParser;
-
 public abstract class AbstractQueryConditionParser implements QueryParser {
 
     private final TermLevelAtomQueryParser termLevelAtomQueryParser;
-    //    private final ScriptAtomQueryParser scriptAtomQueryParser;
+    private final ScriptAtomQueryParser scriptAtomQueryParser;
     private final FullTextAtomQueryParser fullTextAtomQueryParser;
     private final BinaryAtomQueryParser binaryQueryParser;
     private final InListAtomQueryParser inListQueryParser;
@@ -43,7 +42,7 @@ public abstract class AbstractQueryConditionParser implements QueryParser {
         inListQueryParser = new InListAtomQueryParser(parseActionListener);
         betweenAndQueryParser = new BetweenAndAtomQueryParser(parseActionListener);
 
-//        scriptAtomQueryParser = new ScriptAtomQueryParser();
+        scriptAtomQueryParser = new ScriptAtomQueryParser();
     }
 
     protected BoolQueryBuilder parseQueryConditionExpr(SQLExpr conditionExpr, String queryAs, SQLArgs SQLArgs) {
@@ -97,9 +96,9 @@ public abstract class AbstractQueryConditionParser implements QueryParser {
 
             MethodInvocation methodInvocation = new MethodInvocation(methodQueryExpr, queryAs, SQLArgs);
 
-//            if (scriptAtomQueryParser.isMatchMethodInvocation(methodInvocation)) {
-//                return scriptAtomQueryParser.parseAtomMethodQuery(methodInvocation);
-//            }
+            if (scriptAtomQueryParser.isMatchMethodInvocation(methodInvocation)) {
+                return scriptAtomQueryParser.parseAtomMethodQuery(methodInvocation);
+            }
 
             if (fullTextAtomQueryParser.isFulltextAtomQuery(methodInvocation)) {
                 return fullTextAtomQueryParser.parseFullTextAtomQuery(methodQueryExpr, queryAs, SQLArgs);

+ 3 - 6
src/main/java/org/es/sql/parser/sql/QueryOrderConditionParser.java

@@ -18,10 +18,7 @@ import org.es.sql.druid.ElasticSqlSelectQueryBlock;
 import org.es.sql.exception.ElasticSql2DslException;
 import org.es.sql.listener.ParseActionListener;
 import org.es.sql.parser.query.method.MethodInvocation;
-import org.es.sql.parser.sql.sort.ConditionSortBuilder;
-import org.es.sql.parser.sql.sort.MethodSortParser;
-import org.es.sql.parser.sql.sort.NvlMethodSortParser;
-import org.es.sql.parser.sql.sort.ParseSortBuilderHelper;
+import org.es.sql.parser.sql.sort.*;
 
 import java.util.List;
 
@@ -35,8 +32,8 @@ public class QueryOrderConditionParser implements QueryParser {
         this.parseActionListener = parseActionListener;
 
         methodSortParsers = ImmutableList.of(
-                new NvlMethodSortParser()
-//                , new ScriptMethodSortParser()
+                new NvlMethodSortParser(),
+                new ScriptMethodSortParser()
         );
     }
 

+ 63 - 58
src/main/java/org/es/sql/parser/sql/sort/ScriptMethodSortParser.java

@@ -1,58 +1,63 @@
-//package org.es.sql.parser.sql.sort;
-//
-//import com.google.common.collect.ImmutableList;
-//import org.apache.commons.collections.MapUtils;
-//import org.apache.commons.lang.StringUtils;
-//import org.elasticsearch.search.sort.SortBuilder;
-//import org.elasticsearch.search.sort.SortBuilders;
-//import org.elasticsearch.search.sort.SortOrder;
-//import org.es.sql.exception.ElasticSql2DslException;
-//import org.es.sql.parser.query.method.MethodInvocation;
-//
-//import java.util.List;
-//import java.util.Map;
-//
-//public class ScriptMethodSortParser extends AbstractMethodSortParser {
-//
-//    public static final List<String> SCRIPT_SORT_METHOD = ImmutableList.of("script_sort", "scriptSort");
-//
-//    @Override
-//    public List<String> defineMethodNames() {
-//        return SCRIPT_SORT_METHOD;
-//    }
-//
-//    @Override
-//    protected String defineExtraParamString(MethodInvocation invocation) {
-//        if (invocation.getParameterCount() == 3) {
-//            return invocation.getParameterAsString(2);
-//        }
-//        return StringUtils.EMPTY;
-//    }
-//
-//    @Override
-//    public void checkMethodInvocation(MethodInvocation nvlMethodInvocation) throws ElasticSql2DslException {
-//        if (!isMatchMethodInvocation(nvlMethodInvocation)) {
-//            throw new ElasticSql2DslException("[syntax error] Sql sort condition only support script_query method invoke");
-//        }
-//
-//        int methodParameterCount = nvlMethodInvocation.getParameterCount();
-//        if (methodParameterCount != 2 && methodParameterCount != 3) {
-//            throw new ElasticSql2DslException(String.format("[syntax error] There is no %s args method named script_sort", methodParameterCount));
-//        }
-//    }
-//
-//    @Override
-//    protected SortBuilder parseMethodSortBuilderWithExtraParams(
-//            MethodInvocation scriptSortMethodInvocation, SortOrder order, Map<String, Object> extraParamMap) throws ElasticSql2DslException {
-//
-//        String script = scriptSortMethodInvocation.getParameterAsString(0);
-//        String type = scriptSortMethodInvocation.getParameterAsString(1);
-//
-//        if (MapUtils.isNotEmpty(extraParamMap)) {
-//            Map<String, Object> scriptParamMap = generateRawTypeParameterMap(scriptSortMethodInvocation);
-//            return SortBuilders.scriptSort(script, type).order(order).setParams(scriptParamMap);
-//        }
-//
-//        return SortBuilders.scriptSort(script, type).order(order);
-//    }
-//}
+package org.es.sql.parser.sql.sort;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.elasticsearch.script.Script;
+import org.elasticsearch.search.sort.ScriptSortBuilder;
+import org.elasticsearch.search.sort.SortBuilder;
+import org.elasticsearch.search.sort.SortBuilders;
+import org.elasticsearch.search.sort.SortOrder;
+import org.es.sql.exception.ElasticSql2DslException;
+import org.es.sql.parser.query.method.MethodInvocation;
+
+import java.util.List;
+import java.util.Map;
+
+public class ScriptMethodSortParser extends AbstractMethodSortParser {
+
+    public static final List<String> SCRIPT_SORT_METHOD = ImmutableList.of("script_sort", "scriptSort");
+
+    @Override
+    public List<String> defineMethodNames() {
+        return SCRIPT_SORT_METHOD;
+    }
+
+    @Override
+    protected String defineExtraParamString(MethodInvocation invocation) {
+        if (invocation.getParameterCount() == 3) {
+            return invocation.getParameterAsString(2);
+        }
+        return StringUtils.EMPTY;
+    }
+
+    @Override
+    public void checkMethodInvocation(MethodInvocation nvlMethodInvocation) throws ElasticSql2DslException {
+        if (!isMatchMethodInvocation(nvlMethodInvocation)) {
+            throw new ElasticSql2DslException("[syntax error] Sql sort condition only support script_query method invoke");
+        }
+
+        int methodParameterCount = nvlMethodInvocation.getParameterCount();
+        if (methodParameterCount != 2 && methodParameterCount != 3) {
+            throw new ElasticSql2DslException(String.format("[syntax error] There is no %s args method named script_sort", methodParameterCount));
+        }
+    }
+
+    @Override
+    protected SortBuilder parseMethodSortBuilderWithExtraParams(
+            MethodInvocation scriptSortMethodInvocation, SortOrder order, Map<String, Object> extraParamMap) throws ElasticSql2DslException {
+
+        String script = scriptSortMethodInvocation.getParameterAsString(0);
+        String type = scriptSortMethodInvocation.getParameterAsString(1);
+        ScriptSortBuilder.ScriptSortType scriptSortType = ScriptSortBuilder.ScriptSortType.fromString(type);
+
+        if (MapUtils.isNotEmpty(extraParamMap)) {
+            Map<String, Object> scriptParamMap = generateRawTypeParameterMap(scriptSortMethodInvocation);
+            Script scriptObject = new Script(Script.DEFAULT_SCRIPT_TYPE, Script.DEFAULT_SCRIPT_LANG, script, scriptParamMap);
+
+            return SortBuilders.scriptSort(scriptObject, scriptSortType).order(order);
+        }
+
+        return SortBuilders.scriptSort(new Script(script), scriptSortType).order(order);
+    }
+}

+ 0 - 6
target/classes/log4j2.properties

@@ -1,6 +0,0 @@
-appender.console.type = Console
-appender.console.name = console
-appender.console.layout.type = PatternLayout
-
-rootLogger.level = info
-rootLogger.appenderRef.console.ref = console

+ 0 - 32
target/test-classes/application-context.xml

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns="http://www.springframework.org/schema/beans"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
-
-
-
-
-     http://www.springframework.org/schema/context
-     http://www.springframework.org/schema/context/spring-context-2.5.xsd">
-
-
-    <context:component-scan base-package="org.es"/>
-
-    <bean id="elasticDataSource" class="org.es.jdbc.api.ElasticSingleConnectionDataSource" destroy-method="destroy">
-        <property name="driverClassName" value="org.es.jdbc.api.ElasticDriver"/>
-        <property name="url" value="jdbc:elastic:192.168.0.108:9300/lu-search-cluster"/>
-        <property name="suppressClose" value="true"/>
-    </bean>
-
-
-    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
-        <property name="dataSource" ref="elasticDataSource"/>
-        <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
-    </bean>
-
-    <bean id="sqlMapClientTemplate" class="org.es.spring.ElasticSqlMapClientTemplate">
-        <property name="sqlMapClient" ref="sqlMapClient"/>
-    </bean>
-</beans>

+ 0 - 30
target/test-classes/log4j.properties

@@ -1,30 +0,0 @@
-LOG_HOME=/tmp/logs/elasticsearch-query-spring
-
-log4j.appender.reporterAppender=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.reporterAppender.Threshold=DEBUG
-log4j.appender.reporterAppender.File=${LOG_HOME}/elasticsearch-query-spring.log
-log4j.appender.reporterAppender.DatePattern='.'yyyy-MM-dd'.log'
-log4j.appender.reporterAppender.layout=org.apache.log4j.PatternLayout
-log4j.appender.reporterAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS} [%-3p] [%t] %c{3} - %m%n
-
-log4j.appender.warnAppender=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.warnAppender.Threshold=WARN
-log4j.appender.warnAppender.File=${LOG_HOME}/warn.log
-log4j.appender.warnAppender.DatePattern='.'yyyy-MM-dd'.log'
-log4j.appender.warnAppender.layout=org.apache.log4j.PatternLayout
-log4j.appender.warnAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS} [%-3p] [%t] %c{3} - %m%n
-
-log4j.appender.3rdPartyAppender=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.3rdPartyAppender.Threshold=INFO
-log4j.appender.3rdPartyAppender.File=${LOG_HOME}/3rd-party.log
-log4j.appender.3rdPartyAppender.DatePattern='.'yyyy-MM-dd'.log'
-log4j.appender.3rdPartyAppender.layout=org.apache.log4j.PatternLayout
-log4j.appender.3rdPartyAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS} [%-3p] [%t] %c{3} - %m%n
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.Target=System.out
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%c]-[%p]%m%n
-
-log4j.rootLogger=INFO,reporterAppender,console
-#log4j.logger.org.elasticsearch.jdbc.search=DEBUG,remoteAppender

+ 0 - 17
target/test-classes/sqlMapConfig.xml

@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
-        "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
-
-<sqlMapConfig>
-    <settings
-            cacheModelsEnabled="true"
-            lazyLoadingEnabled="true"
-            enhancementEnabled="true"
-            maxSessions="64"
-            maxTransactions="20"
-            maxRequests="128"
-            useStatementNamespaces="true"/>
-
-    <sqlMap resource="sqlmap/PRODUCT.xml"/>
-
-</sqlMapConfig>

+ 0 - 19
target/test-classes/sqlmap/PRODUCT.xml

@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE sqlMap
-        PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
-        "http://ibatis.apache.org/dtd/sql-map-2.dtd">
-<sqlMap namespace="PRODUCT">
-    <select id="getProductByCodeAndMatchWord" parameterClass="java.util.Map" resultClass="java.lang.String">
-        SELECT *
-        FROM index.product
-        QUERY match(productName, #matchWord#) or prefix(productName, #prefixWord#, 'boost:2.0f')
-        WHERE productCode = #productCode#
-        AND advicePrice > #advicePrice#
-        AND $$buyers.buyerName IN ('china', 'usa')
-        ROUTING BY #routingVal#
-    </select>
-
-    <select id="getAllProduct" resultClass="java.lang.String">
-        SELECT * FROM index.product
-    </select>
-</sqlMap>