Skip to content

Commit aa76664

Browse files
authored
Merge pull request #662 from GraphScope/add-query-server
feat: Add query server
2 parents d29586f + dd38f53 commit aa76664

File tree

4 files changed

+63
-7
lines changed

4 files changed

+63
-7
lines changed

packages/studio-components/src/Utils/index.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,36 @@ export const setSearchParams = (params: Record<string, string>, HashMode?: boole
119119
}
120120
};
121121

122+
export const removeSearchParams = (deleteKeys: string[], HashMode?: boolean) => {
123+
const isHashMode = window.location.hash.startsWith('#/') || HashMode;
124+
125+
if (isHashMode) {
126+
// 处理 hash router
127+
let hash = window.location.hash.substring(1);
128+
const [path, search] = hash.split('?');
129+
const searchParams = new URLSearchParams(search);
130+
131+
// 更新 searchParams
132+
deleteKeys.forEach(key => {
133+
searchParams.delete(key);
134+
});
135+
136+
window.location.hash = '#' + path + '?' + searchParams.toString();
137+
} else {
138+
// 处理 browser router
139+
//@ts-ignore
140+
const url = new URL(window.location);
141+
const { searchParams } = url;
142+
143+
deleteKeys.forEach(key => {
144+
searchParams.delete(key);
145+
});
146+
147+
// 更新浏览器的 URL,只改变 search 部分
148+
window.history.pushState({}, '', url);
149+
}
150+
};
151+
122152
export const getCurrentNav = () => {
123153
const hashMode = window.location.hash.startsWith('#/');
124154
if (hashMode) {

packages/studio-query/src/components/connect-endpoint/index.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export type FieldType = {
99
query_language?: string;
1010
query_endpoint?: string;
1111
query_initiation?: 'Browser' | 'Server';
12+
query_initiation_service?: string;
1213
query_username?: string;
1314
query_password?: string;
1415
};
@@ -27,6 +28,7 @@ const ConnectEndpoint: React.FunctionComponent<IConnectEndpointProps> = props =>
2728
query_initiation: props.query_initiation || storage.get('query_initiation') || 'Browser',
2829
query_username: props.query_username || storage.get('query_username') || 'admin',
2930
query_password: props.query_password || storage.get('query_password') || 'password',
31+
query_initiation_service: props.query_initiation_service || storage.get('query_initiation_service') || '',
3032
});
3133
}, []);
3234
const handleConnect = () => {
@@ -37,6 +39,8 @@ const ConnectEndpoint: React.FunctionComponent<IConnectEndpointProps> = props =>
3739
onConnect && onConnect(form.getFieldsValue(true));
3840
};
3941

42+
const query_initiation = Form.useWatch('query_initiation', form);
43+
4044
return (
4145
<Flex vertical style={{ padding: '12px 24px' }}>
4246
<Title level={3} style={{ marginBottom: '12px' }}>
@@ -62,12 +66,20 @@ const ConnectEndpoint: React.FunctionComponent<IConnectEndpointProps> = props =>
6266
options={[
6367
{ label: 'Browser (client-side)', value: 'Browser' },
6468
{
65-
label: `Server (Ensure that your "${location.origin}/query" endpoint is available)`,
69+
label: `Server (server-side)`,
6670
value: 'Server',
6771
},
6872
]}
6973
/>
7074
</Form.Item>
75+
{query_initiation === 'Server' && (
76+
<Form.Item<FieldType>
77+
label={<FormattedMessage id="Query initiation service" />}
78+
name="query_initiation_service"
79+
>
80+
<Input allowClear />
81+
</Form.Item>
82+
)}
7183

7284
<Form.Item<FieldType> label={<FormattedMessage id="Username" />} name="query_username">
7385
<Input />

packages/studio-website/src/layouts/index.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,25 @@ export default function StudioLayout() {
6464
};
6565
const setQueryConfig = () => {
6666
const { GS_ENGINE_TYPE } = window;
67-
const query_language = Utils.storage.get('query_language');
68-
const query_initiation = Utils.storage.get('query_initiation');
69-
if (!query_language) {
67+
68+
const query_language = Utils.getSearchParams('query_language') || Utils.storage.get('query_language');
69+
const query_initiation = Utils.getSearchParams('query_initiation') || Utils.storage.get('query_initiation');
70+
const query_initiation_service =
71+
Utils.getSearchParams('query_initiation_service') || Utils.storage.get('query_initiation_service');
72+
73+
if (query_language) {
74+
Utils.storage.set('query_language', query_language);
75+
} else {
7076
Utils.storage.set('query_language', GS_ENGINE_TYPE === 'interactive' ? 'cypher' : 'gremlin');
7177
}
72-
if (!query_initiation) {
78+
if (query_initiation) {
79+
Utils.storage.set('query_initiation', query_initiation);
80+
} else {
7381
Utils.storage.set('query_initiation', GS_ENGINE_TYPE === 'groot' ? 'Server' : 'Browser');
7482
}
83+
if (query_initiation_service) {
84+
Utils.storage.set('query_initiation_service', query_initiation_service);
85+
}
7586
};
7687
useEffect(() => {
7788
(async () => {
@@ -87,6 +98,8 @@ export default function StudioLayout() {
8798
window.GS_ENGINE_TYPE = engineType;
8899

89100
setQueryConfig();
101+
//这个URL参数不用一直携带着,能够放在localstorage即可
102+
Utils.removeSearchParams(['coordinator', 'query_language', 'query_initiation_service', 'query_initiation']);
90103
/**接着校验可用的graphId */
91104
const checkedRes = await checkGraphId();
92105
if (checkedRes) {

packages/studio-website/src/pages/query/services.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ export const queryGraphData = async (params: IStatement) => {
125125
const query_language = storage.get<'cypher' | 'gremlin'>('query_language') || 'cypher';
126126
const query_endpoint = storage.get<string>('query_endpoint') || '';
127127
const query_initiation = storage.get<'Server' | 'Browser'>('query_initiation');
128+
const query_initiation_service = storage.get<string>('query_initiation_service');
128129
const query_username = storage.get<string>('query_username');
129130
const query_password = storage.get<string>('query_password');
130131

@@ -139,8 +140,8 @@ export const queryGraphData = async (params: IStatement) => {
139140
if (query_initiation === 'Browser') {
140141
return queryGraph(_params);
141142
}
142-
if (query_initiation === 'Server') {
143-
return await fetch('/graph/query', {
143+
if (query_initiation === 'Server' && query_initiation_service) {
144+
return await fetch(query_initiation_service, {
144145
method: 'POST',
145146
headers: {
146147
'Content-Type': 'application/json',

0 commit comments

Comments
 (0)