Skip to content

Commit 95ccbae

Browse files
authored
fix: several issues around search (#502)
* fix: several issues around search * chore: update release notes
1 parent d52ce48 commit 95ccbae

11 files changed

Lines changed: 57 additions & 69 deletions

File tree

docs/content.en/docs/release-notes/_index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Information about release notes of Coco Server is provided here.
2424
- feat: the search input box supports multi-line input #501
2525

2626
### 🐛 Bug fix
27+
- fix: several issues around search #502
28+
2729

2830
### ✈️ Improvements
2931

src-tauri/src/common/http.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ pub async fn get_response_body_text(response: Response) -> Result<String, String
2424
let body = response
2525
.text()
2626
.await
27-
.map_err(|e| format!("Failed to read response body: {}", e))?;
27+
.map_err(|e| format!("Failed to read response body: {}, code: {}", e, status))?;
28+
29+
log::debug!("Response status: {}, body: {}", status, &body);
2830

2931
if status < 200 || status >= 400 {
3032
// Try to parse the error body

src-tauri/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ pub fn run() {
215215
})
216216
.build(ctx)
217217
.expect("error while running tauri application");
218-
218+
219219
app.run(|app_handle, event| match event {
220220
#[cfg(target_os = "macos")]
221221
tauri::RunEvent::Reopen {

src-tauri/src/search/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub async fn query_coco_fusion<R: Runtime>(
5252
timeout(timeout_duration, async {
5353
query_source_clone.search(query).await
5454
})
55-
.await
55+
.await
5656
}));
5757
}
5858

@@ -82,7 +82,7 @@ pub async fn query_coco_fusion<R: Runtime>(
8282
.push((query_hit, score));
8383
}
8484
}
85-
Ok(Err(err)) => {
85+
Ok(Ok(Err(err))) => {
8686
failed_requests.push(FailedRequest {
8787
source: QuerySource {
8888
r#type: "N/A".into(),
@@ -94,28 +94,28 @@ pub async fn query_coco_fusion<R: Runtime>(
9494
reason: None,
9595
});
9696
}
97-
// Timeout reached, skip this request
98-
Ok(_) => {
97+
Ok(Err(err)) => {
9998
failed_requests.push(FailedRequest {
10099
source: QuerySource {
101100
r#type: "N/A".into(),
102101
name: "N/A".into(),
103102
id: "N/A".into(),
104103
},
105104
status: 0,
106-
error: Some("Query source timed out".to_string()),
105+
error: Some(err.to_string()),
107106
reason: None,
108107
});
109108
}
110-
Err(_) => {
109+
// Timeout reached, skip this request
110+
_ => {
111111
failed_requests.push(FailedRequest {
112112
source: QuerySource {
113113
r#type: "N/A".into(),
114114
name: "N/A".into(),
115115
id: "N/A".into(),
116116
},
117117
status: 0,
118-
error: Some("Task panicked".to_string()),
118+
error: Some(format!("{:?}", &result)),
119119
reason: None,
120120
});
121121
}

src-tauri/src/server/connector.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ pub async fn refresh_all_connectors<R: Runtime>(app_handle: &AppHandle<R>) -> Re
3434
// Collect all the tasks for fetching and refreshing connectors
3535
let mut server_map = HashMap::new();
3636
for server in servers {
37+
if !server.enabled {
38+
continue;
39+
}
40+
3741
// dbg!("start fetch connectors for server: {}", &server.id);
3842
let connectors = match get_connectors_by_server(app_handle.clone(), server.id.clone()).await
3943
{

src-tauri/src/server/datasource.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub fn save_datasource_to_cache(server_id: &str, datasources: Vec<DataSource>) {
3232
#[allow(dead_code)]
3333
pub fn get_datasources_from_cache(server_id: &str) -> Option<HashMap<String, DataSource>> {
3434
let cache = DATASOURCE_CACHE.read().unwrap(); // Acquire read lock
35-
// dbg!("cache: {:?}", &cache);
35+
// dbg!("cache: {:?}", &cache);
3636
let server_cache = cache.get(server_id)?; // Get the server's cache
3737
Some(server_cache.clone())
3838
}
@@ -47,6 +47,10 @@ pub async fn refresh_all_datasources<R: Runtime>(_app_handle: &AppHandle<R>) ->
4747
for server in servers {
4848
// dbg!("fetch datasources for server: {}", &server.id);
4949

50+
if !server.enabled {
51+
continue;
52+
}
53+
5054
// Attempt to get datasources by server, and continue even if it fails
5155
let connectors = match datasource_search(server.id.as_str(), None).await {
5256
Ok(connectors) => {
@@ -130,8 +134,8 @@ pub async fn datasource_search(
130134
None,
131135
Some(reqwest::Body::from(body.to_string())),
132136
)
133-
.await
134-
.map_err(|e| format!("Error fetching datasource: {}", e))?;
137+
.await
138+
.map_err(|e| format!("Error fetching datasource: {}", e))?;
135139

136140
// Parse the search results from the response
137141
let datasources: Vec<DataSource> = parse_search_results(resp).await.map_err(|e| {
@@ -186,8 +190,8 @@ pub async fn mcp_server_search(
186190
None,
187191
Some(reqwest::Body::from(body.to_string())),
188192
)
189-
.await
190-
.map_err(|e| format!("Error fetching datasource: {}", e))?;
193+
.await
194+
.map_err(|e| format!("Error fetching datasource: {}", e))?;
191195

192196
// Parse the search results from the response
193197
let mcp_server: Vec<DataSource> = parse_search_results(resp).await.map_err(|e| {

src-tauri/src/server/http_client.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub static HTTP_CLIENT: Lazy<Mutex<Client>> = Lazy::new(|| {
1212
.read_timeout(Duration::from_secs(3)) // Set a timeout of 3 second
1313
.connect_timeout(Duration::from_secs(3)) // Set a timeout of 3 second
1414
.timeout(Duration::from_secs(10)) // Set a timeout of 10 seconds
15-
.danger_accept_invalid_certs(true) // example for self-signed certificates
15+
.danger_accept_invalid_certs(true) // allow self-signed certificates
1616
.build()
1717
.expect("Failed to build client");
1818
Mutex::new(client)
@@ -35,13 +35,19 @@ impl HttpClient {
3535
headers: Option<HashMap<String, String>>,
3636
body: Option<reqwest::Body>,
3737
) -> Result<reqwest::Response, String> {
38+
log::debug!("Sending Request: {}, query_params: {:?}, header: {:?}, body: {:?}",&url, &query_params, &headers, &body);
39+
40+
3841
let request_builder =
3942
Self::get_request_builder(method, url, headers, query_params, body).await;
4043

4144
let response = request_builder.send().await.map_err(|e| {
4245
dbg!("Failed to send request: {}", &e);
4346
format!("Failed to send request: {}", e)
4447
})?;
48+
49+
log::debug!("Request: {}, Response status: {:?}, header: {:?}",&url, &response.status(),&response.headers());
50+
4551
Ok(response)
4652
}
4753

@@ -140,9 +146,7 @@ impl HttpClient {
140146
headers.insert("X-API-TOKEN".to_string(), t);
141147
}
142148

143-
// dbg!(&server_id);
144-
// dbg!(&url);
145-
// dbg!(&headers);
149+
log::debug!("Sending request to server: {}, url: {}, headers: {:?}", &server_id, &url,&headers);
146150

147151
Self::send_raw_request(method, &url, query_params, Some(headers), body).await
148152
} else {

src-tauri/src/server/search.rs

Lines changed: 17 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ use crate::common::search::{QueryHits, QueryResponse, QuerySource, SearchQuery,
55
use crate::common::server::Server;
66
use crate::common::traits::SearchSource;
77
use crate::server::http_client::HttpClient;
8-
use crate::server::servers::get_server_token;
98
use async_trait::async_trait;
109
// use futures::stream::StreamExt;
1110
use ordered_float::OrderedFloat;
12-
use reqwest::{Client, Method, RequestBuilder};
1311
use std::collections::HashMap;
12+
use tauri_plugin_store::JsonValue;
1413
// use std::hash::Hash;
1514

1615
#[allow(dead_code)]
@@ -74,45 +73,11 @@ const COCO_SERVERS: &str = "coco-servers";
7473

7574
pub struct CocoSearchSource {
7675
server: Server,
77-
client: Client,
7876
}
7977

8078
impl CocoSearchSource {
81-
pub fn new(server: Server, client: Client) -> Self {
82-
CocoSearchSource { server, client }
83-
}
84-
85-
async fn build_request_from_query(
86-
&self,
87-
query: &SearchQuery,
88-
) -> Result<RequestBuilder, String> {
89-
self.build_request(query.from, query.size, &query.query_strings)
90-
.await
91-
}
92-
93-
async fn build_request(
94-
&self,
95-
from: u64,
96-
size: u64,
97-
query_strings: &HashMap<String, String>,
98-
) -> Result<RequestBuilder, String> {
99-
let url = HttpClient::join_url(&self.server.endpoint, "/query/_search");
100-
let mut request_builder = self.client.request(Method::GET, url);
101-
102-
if !self.server.public {
103-
if let Some(token) = get_server_token(&self.server.id)
104-
.await?
105-
.map(|t| t.access_token)
106-
{
107-
request_builder = request_builder.header("X-API-TOKEN", token);
108-
}
109-
}
110-
111-
let result = request_builder
112-
.query(&[("from", &from.to_string()), ("size", &size.to_string())])
113-
.query(query_strings);
114-
115-
Ok(result)
79+
pub fn new(server: Server) -> Self {
80+
CocoSearchSource { server }
11681
}
11782
}
11883

@@ -127,17 +92,22 @@ impl SearchSource for CocoSearchSource {
12792
}
12893

12994
async fn search(&self, query: SearchQuery) -> Result<QueryResponse, SearchError> {
130-
// Build the request from the provided query
131-
let request_builder = self
132-
.build_request_from_query(&query)
133-
.await
134-
.map_err(|e| SearchError::InternalError(e.to_string()))?;
95+
let url = "/query/_search";
96+
97+
let mut query_args: HashMap<String, JsonValue> = HashMap::new();
98+
query_args.insert("from".into(), JsonValue::Number(query.from.into()));
99+
query_args.insert("size".into(), JsonValue::Number(query.size.into()));
100+
for (key, value) in query.query_strings {
101+
query_args.insert(key, JsonValue::String(value));
102+
}
135103

136-
// Send the HTTP request and handle errors
137-
let response = request_builder
138-
.send()
104+
let response = HttpClient::get(
105+
&self.server.id,
106+
&url,
107+
Some(query_args),
108+
)
139109
.await
140-
.map_err(|e| SearchError::HttpError(format!("Failed to send search request: {}", e)))?;
110+
.map_err(|e| SearchError::HttpError(format!("Error to send search request: {}", e)))?;
141111

142112
// Use the helper function to parse the response body
143113
let response_body = get_response_body_text(response)

src-tauri/src/server/servers.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::server::http_client::HttpClient;
77
use crate::server::search::CocoSearchSource;
88
use crate::COCO_TAURI_STORE;
99
use lazy_static::lazy_static;
10-
use reqwest::{Client, Method};
10+
use reqwest::Method;
1111
use serde_json::from_value;
1212
use serde_json::Value as JsonValue;
1313
use std::collections::HashMap;
@@ -447,7 +447,7 @@ pub async fn try_register_server_to_search_source(
447447
) {
448448
if server.enabled {
449449
let registry = app_handle.state::<SearchSourceRegistry>();
450-
let source = CocoSearchSource::new(server.clone(), Client::new());
450+
let source = CocoSearchSource::new(server.clone());
451451
registry.register_source(source).await;
452452
}
453453
}

src/commands/servers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ async function invokeWithErrorHandler<T>(
3030
const failedResult = result as any;
3131
if (failedResult.failed?.length > 0) {
3232
failedResult.failed.forEach((error: any) => {
33-
// addError(error.error, 'error');
33+
if (result?.hits?.length == 0) {
34+
addError(error.error, 'error');
35+
}
3436
console.error(error.error);
3537
});
3638
}

0 commit comments

Comments
 (0)