SOLR-8600: add & use ReRankQParserPlugin parameter [default] constants, changed ReRankQuery.toString to use StringBuilder.

This commit is contained in:
Christine Poerschke 2016-02-01 12:00:39 +00:00
parent 15fed60b05
commit 8e27c14aed
4 changed files with 67 additions and 39 deletions

View File

@ -585,6 +585,9 @@ Other Changes
* SOLR-7968: Make QueryComponent more extensible. (Markus Jelsma via David Smiley)
* SOLR-8600: add & use ReRankQParserPlugin parameter [default] constants,
changed ReRankQuery.toString to use StringBuilder. (Christine Poerschke)
================== 5.4.1 ==================
Bug Fixes

View File

@ -64,6 +64,14 @@ public class ReRankQParserPlugin extends QParserPlugin {
public static final String NAME = "rerank";
private static Query defaultQuery = new MatchAllDocsQuery();
public static final String RERANK_QUERY = "reRankQuery";
public static final String RERANK_DOCS = "reRankDocs";
public static final int RERANK_DOCS_DEFAULT = 200;
public static final String RERANK_WEIGHT = "reRankWeight";
public static final double RERANK_WEIGHT_DEFAULT = 2.0d;
public QParser createParser(String query, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
return new ReRankQParser(query, localParams, params, req);
}
@ -75,17 +83,17 @@ public class ReRankQParserPlugin extends QParserPlugin {
}
public Query parse() throws SyntaxError {
String reRankQueryString = localParams.get("reRankQuery");
String reRankQueryString = localParams.get(RERANK_QUERY);
if (reRankQueryString == null || reRankQueryString.trim().length() == 0) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "reRankQuery parameter is mandatory");
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, RERANK_QUERY+" parameter is mandatory");
}
QParser reRankParser = QParser.getParser(reRankQueryString, null, req);
Query reRankQuery = reRankParser.parse();
int reRankDocs = localParams.getInt("reRankDocs", 200);
int reRankDocs = localParams.getInt(RERANK_DOCS, RERANK_DOCS_DEFAULT);
reRankDocs = Math.max(1, reRankDocs); //
double reRankWeight = localParams.getDouble("reRankWeight",2.0d);
double reRankWeight = localParams.getDouble(RERANK_WEIGHT, RERANK_WEIGHT_DEFAULT);
int start = params.getInt(CommonParams.START,CommonParams.START_DEFAULT);
int rows = params.getInt(CommonParams.ROWS,CommonParams.ROWS_DEFAULT);
@ -150,10 +158,13 @@ public class ReRankQParserPlugin extends QParserPlugin {
@Override
public String toString(String s) {
return "{!rerank mainQuery='"+mainQuery.toString()+
"' reRankQuery='"+reRankQuery.toString()+
"' reRankDocs="+reRankDocs+
" reRankWeight="+reRankWeight+"}";
final StringBuilder sb = new StringBuilder(100); // default initialCapacity of 16 won't be enough
sb.append("{!").append(NAME);
sb.append(" mainQuery='").append(mainQuery.toString()).append("' ");
sb.append(RERANK_QUERY).append("='").append(reRankQuery.toString()).append("' ");
sb.append(RERANK_DOCS).append('=').append(reRankDocs).append(' ');
sb.append(RERANK_WEIGHT).append('=').append(reRankWeight).append('}');
return sb.toString();
}
public Query rewrite(IndexReader reader) throws IOException {

View File

@ -124,6 +124,7 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
}
public void testReRankQuery() throws Exception {
final String defType = ReRankQParserPlugin.NAME;
SolrQueryRequest req = req("q", "*:*",
"rqq", "{!edismax}hello",
"rdocs", "20",
@ -131,9 +132,9 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
"rows", "10",
"start", "0");
try {
assertQueryEquals("rerank", req,
"{!rerank reRankQuery=$rqq reRankDocs=$rdocs reRankWeight=$rweight}",
"{!rerank reRankQuery=$rqq reRankDocs=20 reRankWeight=2}");
assertQueryEquals(defType, req,
"{!"+defType+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=$rdocs "+ReRankQParserPlugin.RERANK_WEIGHT+"=$rweight}",
"{!"+defType+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=20 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
} finally {
req.close();
@ -147,9 +148,9 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
"rows", "100",
"start", "50");
try {
assertQueryEquals("rerank", req,
"{!rerank mainQuery=$qq reRankQuery=$rqq reRankDocs=$rdocs reRankWeight=$rweight}",
"{!rerank mainQuery=$qq reRankQuery=$rqq reRankDocs=20 reRankWeight=2}");
assertQueryEquals(defType, req,
"{!"+defType+" mainQuery=$qq "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=$rdocs "+ReRankQParserPlugin.RERANK_WEIGHT+"=$rweight}",
"{!"+defType+" mainQuery=$qq "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=20 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
} finally {
req.close();

View File

@ -44,6 +44,19 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
assertU(commit());
}
@Test
public void testReRankQParserPluginConstants() throws Exception {
assertEquals(ReRankQParserPlugin.NAME, "rerank");
assertEquals(ReRankQParserPlugin.RERANK_QUERY, "reRankQuery");
assertEquals(ReRankQParserPlugin.RERANK_DOCS, "reRankDocs");
assertEquals(ReRankQParserPlugin.RERANK_DOCS_DEFAULT, 200);
assertEquals(ReRankQParserPlugin.RERANK_WEIGHT, "reRankWeight");
assertEquals(ReRankQParserPlugin.RERANK_WEIGHT_DEFAULT, 2.0d, 0.0d);
}
@Test
public void testReRankQueries() throws Exception {
@ -73,7 +86,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=200}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=200}");
params.add("q", "term_s:YYYY");
params.add("rqq", "{!edismax bf=$bff}*:*");
params.add("bff", "field(test_ti)");
@ -89,7 +102,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
);
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "{!edismax bq=$bqq2}*:*");
@ -109,7 +122,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test with sort by score.
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "{!edismax bq=$bqq2}*:*");
@ -130,7 +143,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test with compound sort.
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "{!edismax bq=$bqq2}*:*");
@ -152,7 +165,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test with elevation
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6 reRankWeight=50}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6 "+ReRankQParserPlugin.RERANK_WEIGHT+"=50}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "{!edismax bq=$bqq2}*:*");
@ -175,7 +188,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test TermQuery rqq
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -195,7 +208,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test Elevation
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -217,7 +230,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test Elevation swapped
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -240,7 +253,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=4 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -261,7 +274,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test Elevation with start beyond the rerank docs
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=3 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=3 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -278,7 +291,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test Elevation with zero results
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=3 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=3 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}nada");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -294,7 +307,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Pass in reRankDocs lower then the length being collected.
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=1 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=1 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -312,7 +325,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
);
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=0 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=0 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -330,7 +343,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
);
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=2 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=2 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:4^1000");
@ -349,7 +362,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test reRankWeight of 0, reranking will have no effect.
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6 reRankWeight=0}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6 "+ReRankQParserPlugin.RERANK_WEIGHT+"=0}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "test_ti:50^1000");
@ -374,7 +387,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test range query
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6}");
params.add("q", "test_ti:[0 TO 2000]");
params.add("rqq", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("fl", "id,score");
@ -400,7 +413,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Run same query and see if it was cached. This tests the query result cache hit with rewritten queries
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6}");
params.add("q", "test_ti:[0 TO 2000]");
params.add("rqq", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("fl", "id,score");
@ -424,7 +437,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test range query embedded in larger query
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6}");
// function query for predictible scores (relative to id) independent of similarity
params.add("q", "{!func}id");
// constant score for each clause (unique per doc) for predictible scores independent of similarity
@ -446,7 +459,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test with start beyond reRankDocs
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=3 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=3 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60");
params.add("rqq", "id:1^1000");
params.add("fl", "id,score");
@ -462,7 +475,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test ReRankDocs > docs returned
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=6 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=6 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50");
params.add("rqq", "id:1^1000");
params.add("fl", "id,score");
@ -477,7 +490,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test with zero results
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=3 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=3 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "term_s:NNNN");
params.add("rqq", "id:1^1000");
params.add("fl", "id,score");
@ -531,7 +544,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=11 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=11 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60 id:7^70 id:8^80 id:9^90 id:10^100 id:11^110");
params.add("rqq", "test_ti:50^1000");
@ -546,7 +559,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
//Test Elevation
params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=11 reRankWeight=2}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=11 "+ReRankQParserPlugin.RERANK_WEIGHT+"=2}");
params.add("q", "{!edismax bq=$bqq1}*:*");
params.add("bqq1", "id:1^10 id:2^20 id:3^30 id:4^40 id:5^50 id:6^60 id:7^70 id:8^80 id:9^90 id:10^100 id:11^110");
params.add("rqq", "test_ti:50^1000");
@ -576,14 +589,14 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("rq", "{!rerank reRankQuery=$rqq reRankDocs=200}");
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rqq "+ReRankQParserPlugin.RERANK_DOCS+"=200}");
params.add("q", "term_s:YYYY");
params.add("start", "0");
params.add("rows", "2");
try {
h.query(req(params));
fail("A syntax error should be thrown when reRankQuery parameter is not specified");
fail("A syntax error should be thrown when "+ReRankQParserPlugin.RERANK_QUERY+" parameter is not specified");
} catch (SolrException e) {
assertTrue(e.code() == SolrException.ErrorCode.BAD_REQUEST.code);
}