You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2016/10/04 15:08:56 UTC

[1/5] lucene-solr:master: LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are neither BooleanQuery nor TermQuery.

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6_2 100b50f23 -> 12e7384b3
  refs/heads/branch_6x ffef46ec9 -> 1963b1701
  refs/heads/master 221a6870b -> 6739e075b


LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are neither BooleanQuery nor TermQuery.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6739e075
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6739e075
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6739e075

Branch: refs/heads/master
Commit: 6739e075b4c1dedab3b49b1d299cd713135c1ec3
Parents: 221a687
Author: Steve Rowe <sa...@apache.org>
Authored: Tue Oct 4 10:51:00 2016 -0400
Committer: Steve Rowe <sa...@apache.org>
Committed: Tue Oct 4 10:51:00 2016 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 +++
 .../classic/MultiFieldQueryParser.java          |  6 +++---
 .../classic/TestMultiFieldQueryParser.java      | 22 ++++++++++++++++++++
 3 files changed, 28 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6739e075/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 366ad21..f752217 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -46,6 +46,9 @@ New Features
 
 Bug Fixes
 
+* LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are
+  neither BooleanQuery nor TermQuery.  (Steve Rowe)
+
 Improvements
 
 * LUCENE-7439: FuzzyQuery now matches all terms within the specified

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6739e075/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
index 8ab0dfd..2d8db0d 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
@@ -154,10 +154,10 @@ public class MultiFieldQueryParser extends QueryParser
       for (int i = 0; i < fields.length; i++) {
         Query q = super.getFieldQuery(fields[i], queryText, quoted);
         if (q != null) {
-          if (q instanceof TermQuery) {
-            maxTerms = Math.max(1, maxTerms);
-          } else if (q instanceof BooleanQuery) {
+          if (q instanceof BooleanQuery) {
             maxTerms = Math.max(maxTerms, ((BooleanQuery)q).clauses().size());
+          } else {
+            maxTerms = Math.max(1, maxTerms);
           }
           fieldQueries[i] = q;
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6739e075/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
index 1faf0f6..86ef54b 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
@@ -28,6 +28,7 @@ import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.util.QueryParserTestBase;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
@@ -331,4 +332,25 @@ public class TestMultiFieldQueryParser extends LuceneTestCase {
     assertEquals(bq.build(), mfqp.parse("/[a-z][123]/"));
   }
 
+  /** whitespace+lowercase analyzer with synonyms (dogs,dog) and (guinea pig,cavy) */
+  private class MockSynonymAnalyzer extends Analyzer {
+    @Override
+    public TokenStreamComponents createComponents(String fieldName) {
+      Tokenizer tokenizer = new MockTokenizer(MockTokenizer.WHITESPACE, true);
+      return new TokenStreamComponents(tokenizer, new MockSynonymFilter(tokenizer));
+    }
+  }
+
+  public void testSynonyms() throws ParseException {
+    String[] fields = {"b", "t"};
+    MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new MockSynonymAnalyzer());
+    Query q = parser.parse("dogs");
+    assertEquals("Synonym(b:dog b:dogs) Synonym(t:dog t:dogs)", q.toString());
+    q = parser.parse("guinea pig");
+    assertFalse(parser.getSplitOnWhitespace());
+    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
+    parser.setSplitOnWhitespace(true);
+    q = parser.parse("guinea pig");
+    assertEquals("(b:guinea t:guinea) (b:pig t:pig)", q.toString());
+  }
 }


[3/5] lucene-solr:branch_6x: LUCENE-7472: switch TestMultiFieldQueryParser.testSynonyms default split-on-whitespace to true (it's false on master/7.0)

Posted by sa...@apache.org.
LUCENE-7472: switch TestMultiFieldQueryParser.testSynonyms default split-on-whitespace to true (it's false on master/7.0)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/1963b170
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/1963b170
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/1963b170

Branch: refs/heads/branch_6x
Commit: 1963b1701d2c331daa452ae6d16fc754c3e84bc4
Parents: c398949
Author: Steve Rowe <sa...@apache.org>
Authored: Tue Oct 4 11:03:14 2016 -0400
Committer: Steve Rowe <sa...@apache.org>
Committed: Tue Oct 4 11:03:14 2016 -0400

----------------------------------------------------------------------
 .../queryparser/classic/TestMultiFieldQueryParser.java       | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1963b170/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
index 72bd2a1..7d1b052 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
@@ -348,10 +348,10 @@ public class TestMultiFieldQueryParser extends LuceneTestCase {
     Query q = parser.parse("dogs");
     assertEquals("Synonym(b:dog b:dogs) Synonym(t:dog t:dogs)", q.toString());
     q = parser.parse("guinea pig");
-    assertFalse(parser.getSplitOnWhitespace());
-    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
-    parser.setSplitOnWhitespace(true);
-    q = parser.parse("guinea pig");
+    assertTrue(parser.getSplitOnWhitespace());
     assertEquals("(b:guinea t:guinea) (b:pig t:pig)", q.toString());
+    parser.setSplitOnWhitespace(false);
+    q = parser.parse("guinea pig");
+    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
   }
 }


[2/5] lucene-solr:branch_6x: LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are neither BooleanQuery nor TermQuery.

Posted by sa...@apache.org.
LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are neither BooleanQuery nor TermQuery.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c398949d
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c398949d
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c398949d

Branch: refs/heads/branch_6x
Commit: c398949d3788676bbf8b3f1ae7e819f851d20767
Parents: ffef46e
Author: Steve Rowe <sa...@apache.org>
Authored: Tue Oct 4 10:51:00 2016 -0400
Committer: Steve Rowe <sa...@apache.org>
Committed: Tue Oct 4 10:51:42 2016 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 +++
 .../classic/MultiFieldQueryParser.java          |  6 +++---
 .../classic/TestMultiFieldQueryParser.java      | 22 ++++++++++++++++++++
 3 files changed, 28 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c398949d/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index a240a8e..44b8536 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -11,6 +11,9 @@ New Features
 
 Bug Fixes
 
+* LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are
+  neither BooleanQuery nor TermQuery.  (Steve Rowe)
+
 Improvements
 
 * LUCENE-7439: FuzzyQuery now matches all terms within the specified

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c398949d/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
index 69a7559..2b48930 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
@@ -154,10 +154,10 @@ public class MultiFieldQueryParser extends QueryParser
       for (int i = 0; i < fields.length; i++) {
         Query q = super.getFieldQuery(fields[i], queryText, quoted);
         if (q != null) {
-          if (q instanceof TermQuery) {
-            maxTerms = Math.max(1, maxTerms);
-          } else if (q instanceof BooleanQuery) {
+          if (q instanceof BooleanQuery) {
             maxTerms = Math.max(maxTerms, ((BooleanQuery)q).clauses().size());
+          } else {
+            maxTerms = Math.max(1, maxTerms);
           }
           fieldQueries[i] = q;
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c398949d/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
index d4d8b93..72bd2a1 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
@@ -28,6 +28,7 @@ import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.util.QueryParserTestBase;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
@@ -332,4 +333,25 @@ public class TestMultiFieldQueryParser extends LuceneTestCase {
     assertEquals(bq.build(), mfqp.parse("/[a-z][123]/"));
   }
 
+  /** whitespace+lowercase analyzer with synonyms (dogs,dog) and (guinea pig,cavy) */
+  private class MockSynonymAnalyzer extends Analyzer {
+    @Override
+    public TokenStreamComponents createComponents(String fieldName) {
+      Tokenizer tokenizer = new MockTokenizer(MockTokenizer.WHITESPACE, true);
+      return new TokenStreamComponents(tokenizer, new MockSynonymFilter(tokenizer));
+    }
+  }
+
+  public void testSynonyms() throws ParseException {
+    String[] fields = {"b", "t"};
+    MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new MockSynonymAnalyzer());
+    Query q = parser.parse("dogs");
+    assertEquals("Synonym(b:dog b:dogs) Synonym(t:dog t:dogs)", q.toString());
+    q = parser.parse("guinea pig");
+    assertFalse(parser.getSplitOnWhitespace());
+    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
+    parser.setSplitOnWhitespace(true);
+    q = parser.parse("guinea pig");
+    assertEquals("(b:guinea t:guinea) (b:pig t:pig)", q.toString());
+  }
 }


[5/5] lucene-solr:branch_6_2: LUCENE-7472: switch TestMultiFieldQueryParser.testSynonyms default split-on-whitespace to true (it's false on master/7.0)

Posted by sa...@apache.org.
LUCENE-7472: switch TestMultiFieldQueryParser.testSynonyms default split-on-whitespace to true (it's false on master/7.0)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/12e7384b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/12e7384b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/12e7384b

Branch: refs/heads/branch_6_2
Commit: 12e7384b35a92a366e74af5fd4aed4f555ffd2da
Parents: 4ecc9d8
Author: Steve Rowe <sa...@apache.org>
Authored: Tue Oct 4 11:03:14 2016 -0400
Committer: Steve Rowe <sa...@apache.org>
Committed: Tue Oct 4 11:05:25 2016 -0400

----------------------------------------------------------------------
 .../queryparser/classic/TestMultiFieldQueryParser.java       | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/12e7384b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
index 72bd2a1..7d1b052 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
@@ -348,10 +348,10 @@ public class TestMultiFieldQueryParser extends LuceneTestCase {
     Query q = parser.parse("dogs");
     assertEquals("Synonym(b:dog b:dogs) Synonym(t:dog t:dogs)", q.toString());
     q = parser.parse("guinea pig");
-    assertFalse(parser.getSplitOnWhitespace());
-    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
-    parser.setSplitOnWhitespace(true);
-    q = parser.parse("guinea pig");
+    assertTrue(parser.getSplitOnWhitespace());
     assertEquals("(b:guinea t:guinea) (b:pig t:pig)", q.toString());
+    parser.setSplitOnWhitespace(false);
+    q = parser.parse("guinea pig");
+    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
   }
 }


[4/5] lucene-solr:branch_6_2: LUCENE-7472: move CHANGES.txt entry under 6.2.2 section

Posted by sa...@apache.org.
LUCENE-7472: move CHANGES.txt entry under 6.2.2 section


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4ecc9d8e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4ecc9d8e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4ecc9d8e

Branch: refs/heads/branch_6_2
Commit: 4ecc9d8eeac781ecb5f141491057a57226f61c6a
Parents: 100b50f
Author: Steve Rowe <sa...@apache.org>
Authored: Tue Oct 4 10:51:00 2016 -0400
Committer: Steve Rowe <sa...@apache.org>
Committed: Tue Oct 4 11:05:04 2016 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 +++
 .../classic/MultiFieldQueryParser.java          |  6 +++---
 .../classic/TestMultiFieldQueryParser.java      | 22 ++++++++++++++++++++
 3 files changed, 28 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4ecc9d8e/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 7c6d82e..dfb8435 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -31,6 +31,9 @@ Bug Fixes
   were restored in their original packages: LowercaseFilter and StopFilter,
   as well as several utility classes.  (Uwe Schindler, Mike McCandless)
 
+* LUCENE-7472: MultiFieldQueryParser.getFieldQuery() drops queries that are
+  neither BooleanQuery nor TermQuery.  (Steve Rowe)
+
 ======================= Lucene 6.2.0 =======================
 
 API Changes

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4ecc9d8e/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
index 69a7559..2b48930 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/MultiFieldQueryParser.java
@@ -154,10 +154,10 @@ public class MultiFieldQueryParser extends QueryParser
       for (int i = 0; i < fields.length; i++) {
         Query q = super.getFieldQuery(fields[i], queryText, quoted);
         if (q != null) {
-          if (q instanceof TermQuery) {
-            maxTerms = Math.max(1, maxTerms);
-          } else if (q instanceof BooleanQuery) {
+          if (q instanceof BooleanQuery) {
             maxTerms = Math.max(maxTerms, ((BooleanQuery)q).clauses().size());
+          } else {
+            maxTerms = Math.max(1, maxTerms);
           }
           fieldQueries[i] = q;
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4ecc9d8e/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
index d4d8b93..72bd2a1 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestMultiFieldQueryParser.java
@@ -28,6 +28,7 @@ import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.util.QueryParserTestBase;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
@@ -332,4 +333,25 @@ public class TestMultiFieldQueryParser extends LuceneTestCase {
     assertEquals(bq.build(), mfqp.parse("/[a-z][123]/"));
   }
 
+  /** whitespace+lowercase analyzer with synonyms (dogs,dog) and (guinea pig,cavy) */
+  private class MockSynonymAnalyzer extends Analyzer {
+    @Override
+    public TokenStreamComponents createComponents(String fieldName) {
+      Tokenizer tokenizer = new MockTokenizer(MockTokenizer.WHITESPACE, true);
+      return new TokenStreamComponents(tokenizer, new MockSynonymFilter(tokenizer));
+    }
+  }
+
+  public void testSynonyms() throws ParseException {
+    String[] fields = {"b", "t"};
+    MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new MockSynonymAnalyzer());
+    Query q = parser.parse("dogs");
+    assertEquals("Synonym(b:dog b:dogs) Synonym(t:dog t:dogs)", q.toString());
+    q = parser.parse("guinea pig");
+    assertFalse(parser.getSplitOnWhitespace());
+    assertEquals("(Synonym(b:cavy b:guinea) Synonym(t:cavy t:guinea)) (b:pig t:pig)", q.toString());
+    parser.setSplitOnWhitespace(true);
+    q = parser.parse("guinea pig");
+    assertEquals("(b:guinea t:guinea) (b:pig t:pig)", q.toString());
+  }
 }