From 70edf7500f2765a584f4339e622a2432bf2f4404 Mon Sep 17 00:00:00 2001
From: Frank Morgner <morgnerf@ub.uni-leipzig.de>
Date: Wed, 1 Aug 2018 13:13:10 +0200
Subject: [PATCH] refs #11748 * restrict and bind search of additional records
 to source_id besides as before to record_id alone

---
 .../RecordDriver/SolrDefaultFincTrait.php     | 22 +++++++-----
 .../finc/RecordDriver/SolrMarcFincTrait.php   | 34 ++++++++++++++++++-
 2 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php b/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php
index 96d6e4a21cb..3f7b0291625 100644
--- a/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php
@@ -781,8 +781,11 @@ trait SolrDefaultFincTrait
         // use only one solr request for all
         if (isset($array) && is_array($array)) {
             foreach ($array as $line) {
-                if (isset($line['record_id'])) {
-                    $rids[] = $line['record_id'];
+                if (isset($line['record_id']) && isset($line['source_id'])) {
+                    $rids[] = [
+                        'rid' => $line['record_id'],
+                        'sid' => $line['source_id']
+                    ];
                 }
             }
         }
@@ -790,18 +793,19 @@ trait SolrDefaultFincTrait
         // build the query:
         if (count($rids) == 1) {
             // single query:
-            $value = '"'. $rids[0] .'"';
+            $value = 'record_id:' . $rids[0]['rid']
+                     . ' AND source_id:' . $rids[0]['sid'];
         } elseif (count($rids) > 1) {
             // multi query:
-            $value = '(' . implode(' OR ', $rids) . ')';
+            foreach ($rids as $rid) {
+                $parts[] = '(record_id:' . $rid['rid']
+                           . ' AND source_id:' . $rid['sid'] . ')';
+            }
+            $value = '(' . implode(' OR ', $parts) . ')';
         } else {
             return $array;
         }
-        $query = new \VuFindSearch\Query\Query(
-            'record_id:'. $value
-        );
-        //echo '</pre>'; print_r($query); echo '</pre>';
-
+        $query = new \VuFindSearch\Query\Query($value);
         $bag = new ParamBag();
         $bag->set('fl', 'id,record_id');
         $records =  $this->searchService
diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
index 9c77ffd74bf..a9cd5074ba2 100644
--- a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
+++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php
@@ -357,6 +357,9 @@ trait SolrMarcFincTrait
                     //$id = $this->checkIfRecordExists($matches[2]);
                     //if ($id != null) {
                     $array[$key]['record_id'] = $matches[2].$matches[3];
+                    if (null != ($sid = $this->getSourceID())) {
+                        $array[$key]['source_id'] = $sid;
+                    }
                     //}
                     //break;
                 }
@@ -1107,7 +1110,10 @@ trait SolrMarcFincTrait
                 $text = $current->getData();
                 // Extract parenthetical prefixes:
                 if (preg_match(self::BSZ_PATTERN, $text, $matches)) {
-                    $array[$key]['record_id'] = $matches[2].$matches[3];
+                    $array[$key]['record_id'] = $matches[2] . $matches[3];
+                    if (null != ($sid = $this->getSourceID())) {
+                        $array[$key]['source_id'] = $sid;
+                    }
                 }
             } // end foreach
         } // end foreach
@@ -1267,6 +1273,9 @@ trait SolrMarcFincTrait
                                 // Extract parenthetical prefixes:
                                 if (preg_match(self::BSZ_PATTERN, $text, $matches)) {
                                     $array[$key]['record_id'] = $matches[2].$matches[3];
+                                    if (null != ($sid = $this->getSourceID())) {
+                                        $array[$key]['source_id'] = $sid;
+                                    }
                                 }
                             } // end foreach
                         } // end if
@@ -1310,6 +1319,9 @@ trait SolrMarcFincTrait
                 // Extract parenthetical prefixes:
                 if (preg_match(self::BSZ_PATTERN, $text, $matches)) {
                     $array[$key]['record_id'] = $matches[2].$matches[3];
+                    if (null != ($sid = $this->getSourceID())) {
+                        $array[$key]['source_id'] = $sid;
+                    }
                 }
             } // end foreach
         } // end foreach
@@ -1390,6 +1402,23 @@ trait SolrMarcFincTrait
         return $this->getFieldArray('830', ['a', 'v'], false);
     }
 
+    /**
+     * Get source id of marc record. Alternate method getFirstFieldValue returns
+     * null by value "0" therefor it doesn't fit properly.
+     *
+     * @return string|null
+     * @access public
+     */
+    public function getSourceID()
+    {
+        $source_ids = $this->getMarcRecord()->getFields('980');
+        if (!$source_ids) {
+            return null;
+        }
+        return (string)$source_ids[0]->getSubfield('b')->getData();
+    }
+
+
     /**
      * Get local classification of UDK.
      *
@@ -1524,6 +1553,9 @@ trait SolrMarcFincTrait
                                     if (preg_match(self::BSZ_PATTERN, $text, $matches)) {
                                         $array[$i]['record_id']
                                             = $matches[2] . $matches[3];
+                                        if (null != ($sid = $this->getSourceID())) {
+                                            $array[$key]['source_id'] = $sid;
+                                        }
                                     }
                                 }
                             }
-- 
GitLab