visuddhinanda 2 лет назад
Родитель
Сommit
0afc4b56f1
1 измененных файлов с 63 добавлено и 3 удалено
  1. 63 3
      rpc/tulip/tulip/server.php

+ 63 - 3
rpc/tulip/tulip/server.php

@@ -81,9 +81,11 @@ class Greeter extends \Mint\Tulip\V1\SearchStub
             $queryBookId = '';
         }
         echo 'query books = '.implode(',',$bookId).PHP_EOL;
+
+        $matchMode = $request->getMatchMode();
+        echo 'query mode = '.$matchMode.PHP_EOL;
         $param = [];
         $countParam = [];
-        $matchMode = 'case';
         switch ($matchMode) {
             case 'complete':
             case 'case':
@@ -106,7 +108,7 @@ class Greeter extends \Mint\Tulip\V1\SearchStub
                 break;
             case 'similar':
                 # 形似,去掉变音符号
-                $key = Tools::getWordEn($keyWords[0]);
+                $key = $this->getWordEn($keyWords[0]);
                 $querySelect_rank = "
                     ts_rank('{0.1, 1, 0.3, 0.2}',
                         full_text_search_weighted_unaccent,
@@ -183,6 +185,57 @@ class Greeter extends \Mint\Tulip\V1\SearchStub
         return $response;
     }
 
+    /**
+     * @param \Mint\Tulip\V1\SearchRequest $request client request
+     * @param \Grpc\ServerContext $context server request context
+     * @return \Mint\Tulip\V1\BookListResponse for response data, null if if error occured
+     *     initial metadata (if any) and status (if not ok) should be set to $context
+     */
+    public function BookList(
+        \Mint\Tulip\V1\SearchRequest $request,
+        \Grpc\ServerContext $context
+    ): ?\Mint\Tulip\V1\BookListResponse {
+        $keyWords = [];
+        foreach ($request->getKeywords()->getIterator() as $word) {
+            $keyWords[] = $word;
+        }
+        echo "Received request words = ".implode(',',$keyWords) .PHP_EOL;
+        /**
+         * 查询业务逻辑
+         */
+
+         $searchChapters = [];
+         $searchBooks = [];
+         $searchBookId = [];
+         $bookId = [];
+         if($request->getBooks()->count()>0){
+             foreach ($request->getBooks()->getIterator() as $book) {
+                 $bookId[] = $book;
+             }
+             $queryBookId = ' AND pcd_book_id in ('.implode(',',$bookId).') ';
+         }else{
+             $queryBookId = '';
+         }
+         echo 'query books = '.implode(',',$bookId).PHP_EOL;
+ 
+         $matchMode = $request->getMatchMode();
+         echo 'query mode = '.$matchMode.PHP_EOL;
+         $queryWhere = $this->makeQueryWhere($keyWords,$matchMode);
+         $query = "SELECT pcd_book_id, count(*) as co FROM fts_texts WHERE {$queryWhere['query']} {$queryBookId} GROUP BY pcd_book_id ORDER BY co DESC;";
+         $result = $this->dbSelect($query, $queryWhere['param']);
+         //返回数据
+         $response = new \Mint\Tulip\V1\BookListResponse();
+         $output = $response->getItems();
+         foreach ($result as $row) {
+             $item = new \Mint\Tulip\V1\BookListResponse\Item;
+             $item->setBook($row['pcd_book_id']);
+             $item->setCount($row['co']);
+             $output[] = $item;
+         }
+         echo "total=".count($output).PHP_EOL;
+         return $response;
+    }
+
     private function makeQueryWhere($key,$match){
         $param = [];
         $queryWhere = '';
@@ -199,12 +252,19 @@ class Greeter extends \Mint\Tulip\V1\SearchStub
             case 'similar':
                 # 形似,去掉变音符号
                 $queryWhere = " full_text_search_weighted_unaccent @@ websearch_to_tsquery('pali_unaccent', ?) ";
-                $key = Tools::getWordEn($key[0]);
+                $key = $this->getWordEn($key[0]);
                 $param = [$key];
                 break;
         };
         return (['query'=>$queryWhere,'param'=>$param]);
     }
+
+    private function getWordEn($strIn)
+    {
+        $out = str_replace(["ā","ī","ū","ṅ","ñ","ṭ","ḍ","ṇ","ḷ","ṃ"],
+                        ["a","i","u","n","n","t","d","n","l","m"], $strIn);
+        return ($out);
+    }
 }
 
 $port = Config['port'];