From 650a4cc3d8e7c5176d0634114b4918d59ff5171e Mon Sep 17 00:00:00 2001
From: Demian Katz <demian.katz@villanova.edu>
Date: Tue, 27 Aug 2013 12:01:04 -0400
Subject: [PATCH] Allow Solr backends to use different uniqueKey values.
 Resolves VUFIND-877.

---
 .../Factory/AbstractSolrBackendFactory.php    | 11 +++++++++-
 .../VuFindSearch/Backend/Solr/Connector.php   | 21 ++++++++++++++-----
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php b/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php
index 38a2758ef12..3f395dd9799 100644
--- a/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php
+++ b/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php
@@ -97,6 +97,13 @@ abstract class AbstractSolrBackendFactory implements FactoryInterface
      */
     protected $solrCore = '';
 
+    /**
+     * Solr field used to store unique identifiers
+     *
+     * @var string
+     */
+    protected $uniqueKey = 'id';
+
     /**
      * Constructor
      */
@@ -254,7 +261,9 @@ abstract class AbstractSolrBackendFactory implements FactoryInterface
             }
         }
 
-        $connector = new Connector($this->getSolrUrl(), new HandlerMap($handlers));
+        $connector = new Connector(
+            $this->getSolrUrl(), new HandlerMap($handlers), $this->uniqueKey
+        );
         $connector->setTimeout(
             isset($config->Index->timeout) ? $config->Index->timeout : 30
         );
diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php
index d49a7d75917..e12b974dde2 100644
--- a/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php
+++ b/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php
@@ -95,6 +95,13 @@ class Connector
      */
     protected $map;
 
+    /**
+     * Solr field used to store unique identifier
+     *
+     * @var string
+     */
+    protected $uniqueKey;
+
     /**
      * HTTP read timeout.
      *
@@ -121,15 +128,17 @@ class Connector
     /**
      * Constructor
      *
-     * @param string     $url SOLR base URL
-     * @param HandlerMap $map Handler map
+     * @param string     $url       SOLR base URL
+     * @param HandlerMap $map       Handler map
+     * @param string     $uniqueKey Solr field used to store unique identifier
      *
      * @return void
      */
-    public function __construct($url, HandlerMap $map)
+    public function __construct($url, HandlerMap $map, $uniqueKey = 'id')
     {
         $this->url = $url;
         $this->map = $map;
+        $this->uniqueKey = $uniqueKey;
     }
 
     /// Public API
@@ -165,7 +174,8 @@ class Connector
     public function retrieve($id, ParamBag $params = null)
     {
         $params = $params ?: new ParamBag();
-        $params->set('q', sprintf('id:"%s"', addcslashes($id, '"')));
+        $params
+            ->set('q', sprintf('%s:"%s"', $this->uniqueKey, addcslashes($id, '"')));
 
         $handler = $this->map->getHandler(__FUNCTION__);
         $this->map->prepare(__FUNCTION__, $params);
@@ -186,7 +196,8 @@ class Connector
     public function similar($id, ParamBag $params = null)
     {
         $params = $params ?: new ParamBag();
-        $params->set('q', sprintf('id:"%s"', addcslashes($id, '"')));
+        $params
+            ->set('q', sprintf('%s:"%s"', $this->uniqueKey, addcslashes($id, '"')));
         $params->set('qt', 'morelikethis');
 
         $handler = $this->map->getHandler(__FUNCTION__);
-- 
GitLab