You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/05/08 00:30:17 UTC

[47/50] [abbrv] git commit: [#2053] Add config switch to control use of new solr fields

[#2053] Add config switch to control use of new solr fields

Signed-off-by: Tim Van Steenburgh <tv...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/6bde6ad1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/6bde6ad1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/6bde6ad1

Branch: refs/heads/tv/2053
Commit: 6bde6ad1f1f5cf21227ab9d97ad6a494b8de266b
Parents: 58d9661
Author: Tim Van Steenburgh <tv...@gmail.com>
Authored: Tue May 7 16:11:33 2013 -0400
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Tue May 7 18:28:56 2013 -0400

----------------------------------------------------------------------
 Allura/allura/lib/utils.py                |   11 +++++++-
 Allura/allura/tests/test_utils.py         |   22 +++++++++++++++-
 Allura/development.ini                    |    5 +++
 ForgeTracker/forgetracker/model/ticket.py |   32 ++++++++++++------------
 4 files changed, 52 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6bde6ad1/Allura/allura/lib/utils.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index c60f33b..2424930 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -37,6 +37,7 @@ from formencode import Invalid
 from tg.decorators import before_validate
 from pylons import response
 from pylons import tmpl_context as c
+from paste.deploy.converters import asbool
 from paste.httpheaders import CACHE_CONTROL, EXPIRES
 from webhelpers.html import literal
 from webob import exc
@@ -64,6 +65,7 @@ def guess_mime_type(filename):
         content_type = 'application/octet-stream'
     return content_type
 
+
 class ConfigProxy(object):
     '''Wrapper for loading config values at module-scope so we don't
     have problems when a module is imported before tg.config is initialized
@@ -73,7 +75,14 @@ class ConfigProxy(object):
         self._kw = kw
 
     def __getattr__(self, k):
-        return tg.config[self._kw[k]]
+        return self.get(k)
+
+    def get(self, key, default=None):
+        return tg.config.get(self._kw.get(key, key), default)
+
+    def get_bool(self, key):
+        return asbool(self.get(key))
+
 
 class lazy_logger(object):
     '''Lazy instatiation of a logger, to ensure that it does not get

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6bde6ad1/Allura/allura/tests/test_utils.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_utils.py b/Allura/allura/tests/test_utils.py
index d20aa55..bd44ca2 100644
--- a/Allura/allura/tests/test_utils.py
+++ b/Allura/allura/tests/test_utils.py
@@ -23,7 +23,7 @@ from os import path
 
 import pylons
 from webob import Request
-from mock import Mock
+from mock import Mock, patch
 from nose.tools import assert_equal
 from pygments import highlight
 from pygments.lexers import get_lexer_for_filename
@@ -34,6 +34,26 @@ from allura import model as M
 from allura.lib import utils
 
 
+@patch.dict('allura.lib.utils.tg.config', clear=True, foo='bar', baz='true')
+class TestConfigProxy(unittest.TestCase):
+    def setUp(self):
+        self.cp = utils.ConfigProxy(mybaz="baz")
+
+    def test_getattr(self):
+        self.assertEqual(self.cp.foo, "bar")
+        self.assertEqual(self.cp.mybaz, "true")
+
+    def test_get(self):
+        self.assertEqual(self.cp.get("foo"), "bar")
+        self.assertEqual(self.cp.get("mybaz"), "true")
+        self.assertEqual(self.cp.get("fake"), None)
+        self.assertEqual(self.cp.get("fake", "default"), "default")
+
+    def test_get_bool(self):
+        self.assertEqual(self.cp.get_bool("mybaz"), True)
+        self.assertEqual(self.cp.get_bool("fake"), False)
+
+
 class TestChunkedIterator(unittest.TestCase):
 
     def setUp(self):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6bde6ad1/Allura/development.ini
----------------------------------------------------------------------
diff --git a/Allura/development.ini b/Allura/development.ini
index 737a08b..f485d17 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -182,6 +182,11 @@ solr.server = http://localhost:8983/solr
 solr.commit = false
 # commit add operations within N ms
 solr.commitWithin = 10000
+# Use improved data types for labels and custom fields?
+# New Allura deployments should leave this set to true. Existing deployments
+# should set to false until existing data has been reindexed. Reindexing will
+# convert existing label and custom field data to more appropriate solr types.
+solr.use_new_types = true
 
 # Forgemail server
 forgemail.host = 0.0.0.0

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6bde6ad1/ForgeTracker/forgetracker/model/ticket.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/model/ticket.py b/ForgeTracker/forgetracker/model/ticket.py
index 10259d0..3e2fde2 100644
--- a/ForgeTracker/forgetracker/model/ticket.py
+++ b/ForgeTracker/forgetracker/model/ticket.py
@@ -50,7 +50,8 @@ log = logging.getLogger(__name__)
 CUSTOM_FIELD_SOLR_TYPES = dict(boolean='_b', number='_i')
 
 config = utils.ConfigProxy(
-    common_suffix='forgemail.domain')
+    common_suffix='forgemail.domain',
+    new_solr='solr.use_new_types')
 
 class Globals(MappedClass):
 
@@ -201,10 +202,10 @@ class Globals(MappedClass):
 
     def sortable_custom_fields_shown_in_search(self):
         def solr_type(field_name):
-            # TODO POST-SOLR-REINDEX: Remove the following line. It temporarily
-            # forces the solr field type to string (_s) until the new index
-            # (with newly typed fields) is built.
-            return '_s'
+            # Pre solr-4.2.1 code indexed all custom fields as strings, so
+            # they must be searched as such.
+            if not config.get_bool('new_solr'):
+                return '_s'
             return self.get_custom_field_solr_type(field_name) or '_s'
 
         return [dict(
@@ -365,13 +366,12 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
             )
         for k, v in self.custom_fields.iteritems():
             field_value = unicode(v)
-            # Index all custom fields as Solr strings. This is actually wrong,
-            # but it's what the current code expects.
-            # TODO POST-SOLR-REINDEX: remove this line
-            result[k + '_s'] = field_value
+            # Pre solr-4.2.1 code expects all custom fields to be indexed
+            # as strings.
+            if not config.get_bool('new_solr'):
+                result[k + '_s'] = field_value
 
-            # Now let's also index with proper Solr types. After reindexing to
-            # add these, remove the catch-all string-type indexing above.
+            # Now let's also index with proper Solr types.
             solr_type = self.app.globals.get_custom_field_solr_type(k)
             if solr_type:
                 result[k + solr_type] = field_value
@@ -397,11 +397,11 @@ class Ticket(VersionedArtifact, ActivityObject, VotableArtifact):
         solr_field = '{0}{1}'
         solr_type = '_s'
         for f in cf:
-            # TODO POST-SOLR-REINDEX: uncomment this line to enable searching
-            # on new properly typed solr fields instead of the old catch-all
-            # string fields.
-            # solr_type = (c.app.globals.get_custom_field_solr_type(f)
-                    # or solr_type)
+            # Solr 4.2.1 index contains properly typed custom fields, so we
+            # can search on those instead of the old string-type solr fields.
+            if config.get_bool('new_solr'):
+                solr_type = (c.app.globals.get_custom_field_solr_type(f)
+                        or solr_type)
             actual = solr_field.format(f, solr_type)
             q = q.replace(f + ':', actual + ':')
         return q