Browse Source

fianl : vector-search-feature

Oracle Public Cloud User 3 months ago
parent
commit
e0afd7f496
1 changed files with 15 additions and 8 deletions
  1. 15 8
      backend/open_webui/retrieval/vector/dbs/oracle23ai.py

+ 15 - 8
backend/open_webui/retrieval/vector/dbs/oracle23ai.py

@@ -566,7 +566,9 @@ class Oracle23aiClient(VectorDBBase):
                         for row in results:
                             ids[qid].append(row[0])
                             documents[qid].append(row[1].read() if isinstance(row[1], oracledb.LOB) else str(row[1]))
-                            metadatas[qid].append(row[2].read() if isinstance(row[2], oracledb.LOB) else row[2])
+                            # 🔧 FIXED: Parse JSON metadata properly
+                            metadata_str = row[2].read() if isinstance(row[2], oracledb.LOB) else row[2]
+                            metadatas[qid].append(self._json_to_metadata(metadata_str))
                             distances[qid].append(float(row[3]))
             
             log.info(f"Search completed. Found {sum(len(ids[i]) for i in range(num_queries))} total results.")
@@ -640,8 +642,10 @@ class Oracle23aiClient(VectorDBBase):
             
             ids = [[row[0] for row in results]]
             documents = [[row[1].read() if isinstance(row[1], oracledb.LOB) else str(row[1]) for row in results]]
-            metadatas = [[row[2].read() if isinstance(row[2], oracledb.LOB) else row[2] for row in results]]
-            log.info(f"Query completed. Found {len(ids)} results.")
+            # 🔧 FIXED: Parse JSON metadata properly
+            metadatas = [[self._json_to_metadata(row[2].read() if isinstance(row[2], oracledb.LOB) else row[2]) for row in results]]
+            
+            log.info(f"Query completed. Found {len(results)} results.")
             
             return GetResult(
                 ids=ids,
@@ -700,8 +704,9 @@ class Oracle23aiClient(VectorDBBase):
             
             ids = [[row[0] for row in results]]
             documents = [[row[1].read() if isinstance(row[1], oracledb.LOB) else str(row[1]) for row in results]]
-            metadatas = [[row[2].read() if isinstance(row[2], oracledb.LOB) else row[2] for row in results]]
-            
+            # 🔧 FIXED: Parse JSON metadata properly
+            metadatas = [[self._json_to_metadata(row[2].read() if isinstance(row[2], oracledb.LOB) else row[2]) for row in results]]
+           
             return GetResult(
                 ids=ids,
                 documents=documents,
@@ -745,9 +750,11 @@ class Oracle23aiClient(VectorDBBase):
             params = {'collection_name': collection_name}
             
             if ids:
-                # Use proper parameterized query for IDs
-                id_list = ",".join([f"'{id}'" for id in ids])
-                query += f" AND id IN ({id_list})"
+                # 🔧 FIXED: Use proper parameterized query to prevent SQL injection
+                placeholders = ','.join([f':id_{i}' for i in range(len(ids))])
+                query += f" AND id IN ({placeholders})"
+                for i, id_val in enumerate(ids):
+                    params[f'id_{i}'] = id_val
             
             if filter:
                 for i, (key, value) in enumerate(filter.items()):