Browse Source

fix query page bug after switching pages

Signed-off-by: ryjiang <jiangruiyi@gmail.com>
ryjiang 5 months ago
parent
commit
158a36d937

+ 28 - 28
client/src/hooks/Query.ts

@@ -2,40 +2,32 @@ import { useState, useRef, useEffect } from 'react';
 import { DataTypeStringEnum, MIN_INT64 } from '@/consts';
 import { DataTypeStringEnum, MIN_INT64 } from '@/consts';
 import { CollectionService } from '@/http';
 import { CollectionService } from '@/http';
 import type { CollectionFullObject } from '@server/types';
 import type { CollectionFullObject } from '@server/types';
+import { QueryState } from '@/pages/databases/types';
 
 
 // TODO: refactor this, a little bit messy
 // TODO: refactor this, a little bit messy
 export const useQuery = (params: {
 export const useQuery = (params: {
   collection: CollectionFullObject;
   collection: CollectionFullObject;
-  outputFields: string[];
-  consistencyLevel: string;
   onQueryStart: Function;
   onQueryStart: Function;
   onQueryEnd?: Function;
   onQueryEnd?: Function;
   onQueryFinally?: Function;
   onQueryFinally?: Function;
-  initialExpr: string;
+  queryState: QueryState;
+  setQueryState: (state: QueryState) => void;
 }) => {
 }) => {
   // params
   // params
-  const {
-    collection,
-    outputFields,
-    onQueryStart,
-    onQueryEnd,
-    onQueryFinally,
-    consistencyLevel,
-    initialExpr,
-  } = params;
+  const { collection, onQueryStart, onQueryEnd, onQueryFinally, queryState } =
+    params;
 
 
   // states
   // states
   const [currentPage, setCurrentPage] = useState<number>(0);
   const [currentPage, setCurrentPage] = useState<number>(0);
   const [pageSize, setPageSize] = useState<number>(0);
   const [pageSize, setPageSize] = useState<number>(0);
-  const [total, setTotal] = useState<number>(collection.rowCount);
-  const [expr, setExpr] = useState<string>(initialExpr);
+  const [total, setTotal] = useState<number>(0);
   const [queryResult, setQueryResult] = useState<any>({ data: [], latency: 0 });
   const [queryResult, setQueryResult] = useState<any>({ data: [], latency: 0 });
 
 
   // build local cache for pk ids
   // build local cache for pk ids
   const pageCache = useRef(new Map());
   const pageCache = useRef(new Map());
 
 
   // get next/previous expression
   // get next/previous expression
-  const getPageExpr = (page: number) => {
+  const getPageExpr = (page: number, expr = queryState.expr) => {
     const cache = pageCache.current.get(
     const cache = pageCache.current.get(
       page > currentPage ? currentPage : page
       page > currentPage ? currentPage : page
     );
     );
@@ -69,11 +61,12 @@ export const useQuery = (params: {
   // query function
   // query function
   const query = async (
   const query = async (
     page: number = currentPage,
     page: number = currentPage,
-    consistency_level = consistencyLevel,
-    _outputFields = outputFields
+    consistency_level = queryState.consistencyLevel,
+    _outputFields = queryState.outputFields,
+    expr = queryState.expr
   ) => {
   ) => {
     if (!collection || !collection.loaded) return;
     if (!collection || !collection.loaded) return;
-    const _expr = getPageExpr(page);
+    const _expr = getPageExpr(page, expr);
 
 
     onQueryStart(_expr);
     onQueryStart(_expr);
 
 
@@ -124,7 +117,10 @@ export const useQuery = (params: {
     }
     }
   };
   };
 
 
-  const count = async (consistency_level = consistencyLevel) => {
+  const count = async (
+    consistency_level = queryState.consistencyLevel,
+    expr = queryState.expr
+  ) => {
     if (!collection || !collection.loaded) {
     if (!collection || !collection.loaded) {
       setTotal(collection.rowCount);
       setTotal(collection.rowCount);
       return;
       return;
@@ -156,15 +152,23 @@ export const useQuery = (params: {
     } // reset
     } // reset
     reset();
     reset();
     // get count;
     // get count;
-    count();
+    count(queryState.expr);
 
 
     // do the query
     // do the query
-    query(currentPage, consistencyLevel, outputFields);
+    query(
+      currentPage,
+      queryState.consistencyLevel,
+      queryState.outputFields,
+      queryState.expr
+    );
   }, [
   }, [
-    expr,
     pageSize,
     pageSize,
-    collection.collection_name,
-    JSON.stringify(outputFields),
+    JSON.stringify([
+      queryState.outputFields,
+      queryState.collection,
+      queryState.consistencyLevel,
+      queryState.expr,
+    ]),
   ]);
   ]);
 
 
   return {
   return {
@@ -178,10 +182,6 @@ export const useQuery = (params: {
     currentPage,
     currentPage,
     // query current data page
     // query current data page
     setCurrentPage,
     setCurrentPage,
-    // expression to query
-    expr,
-    // expression updater
-    setExpr,
     // query result
     // query result
     queryResult,
     queryResult,
     // query
     // query

+ 26 - 26
client/src/pages/databases/collections/data/CollectionData.tsx

@@ -50,6 +50,7 @@ const CollectionData = (props: CollectionDataProps) => {
   // UI state
   // UI state
   const [tableLoading, setTableLoading] = useState<boolean>();
   const [tableLoading, setTableLoading] = useState<boolean>();
   const [selectedData, setSelectedData] = useState<any[]>([]);
   const [selectedData, setSelectedData] = useState<any[]>([]);
+  const [exprInput, setExprInput] = useState<string>(queryState.expr);
 
 
   // UI functions
   // UI functions
   const { setDialog, handleCloseDialog, openSnackBar, setDrawer } =
   const { setDialog, handleCloseDialog, openSnackBar, setDrawer } =
@@ -78,17 +79,22 @@ const CollectionData = (props: CollectionDataProps) => {
     const currentFilter: any = filterRef.current;
     const currentFilter: any = filterRef.current;
     currentFilter?.getReset();
     currentFilter?.getReset();
     // update UI expression
     // update UI expression
-    setQueryState({ ...queryState, expr: '' });
-    // reset query
-    reset();
+    setExprInput('');
+    setQueryState({
+      ...queryState,
+      expr: '',
+      outputFields: [
+        ...collection.schema.fields,
+        ...collection.schema.dynamicFields,
+      ].map(f => f.name),
+    });
+
     // ensure not loading
     // ensure not loading
     setTableLoading(false);
     setTableLoading(false);
   };
   };
   const handleFilterSubmit = async (expression: string) => {
   const handleFilterSubmit = async (expression: string) => {
     // update UI expression
     // update UI expression
     setQueryState({ ...queryState, expr: expression });
     setQueryState({ ...queryState, expr: expression });
-    // update expression
-    setExpr(expression);
   };
   };
   const handlePageChange = async (e: any, page: number) => {
   const handlePageChange = async (e: any, page: number) => {
     // do the query
     // do the query
@@ -131,15 +137,11 @@ const CollectionData = (props: CollectionDataProps) => {
     queryResult,
     queryResult,
     setPageSize,
     setPageSize,
     setCurrentPage,
     setCurrentPage,
-    setExpr,
     query,
     query,
     reset,
     reset,
     count,
     count,
-    expr,
   } = useQuery({
   } = useQuery({
     collection,
     collection,
-    consistencyLevel: queryState.consistencyLevel,
-    outputFields: queryState.outputFields,
     onQueryStart: (expr: string = '') => {
     onQueryStart: (expr: string = '') => {
       setTableLoading(true);
       setTableLoading(true);
       if (expr === '') {
       if (expr === '') {
@@ -150,7 +152,8 @@ const CollectionData = (props: CollectionDataProps) => {
     onQueryFinally: () => {
     onQueryFinally: () => {
       setTableLoading(false);
       setTableLoading(false);
     },
     },
-    initialExpr: queryState.expr,
+    queryState: queryState,
+    setQueryState: setQueryState,
   });
   });
 
 
   const onInsert = async (collectionName: string) => {
   const onInsert = async (collectionName: string) => {
@@ -158,7 +161,12 @@ const CollectionData = (props: CollectionDataProps) => {
   };
   };
 
 
   const onEditEntity = async () => {
   const onEditEntity = async () => {
-    await query(currentPage, ConsistencyLevelEnum.Strong);
+    await query(
+      currentPage,
+      ConsistencyLevelEnum.Strong,
+      queryState.outputFields,
+      queryState.expr
+    );
   };
   };
 
 
   // Toolbar settings
   // Toolbar settings
@@ -355,6 +363,7 @@ const CollectionData = (props: CollectionDataProps) => {
   useEffect(() => {
   useEffect(() => {
     // reset selection
     // reset selection
     setSelectedData([]);
     setSelectedData([]);
+    setExprInput(queryState.expr);
   }, [collection.collection_name]);
   }, [collection.collection_name]);
 
 
   return (
   return (
@@ -367,15 +376,15 @@ const CollectionData = (props: CollectionDataProps) => {
               <CustomInput
               <CustomInput
                 type="text"
                 type="text"
                 textConfig={{
                 textConfig={{
-                  label: queryState.expr
+                  label: exprInput
                     ? collectionTrans('queryExpression')
                     ? collectionTrans('queryExpression')
                     : collectionTrans('exprPlaceHolder'),
                     : collectionTrans('exprPlaceHolder'),
                   key: 'advFilter',
                   key: 'advFilter',
                   className: 'textarea',
                   className: 'textarea',
                   onChange: (value: string) => {
                   onChange: (value: string) => {
-                    setQueryState({ ...queryState, expr: value });
+                    setExprInput(value);
                   },
                   },
-                  value: queryState.expr,
+                  value: exprInput,
                   disabled: !collection.loaded,
                   disabled: !collection.loaded,
                   variant: 'filled',
                   variant: 'filled',
                   required: false,
                   required: false,
@@ -394,14 +403,9 @@ const CollectionData = (props: CollectionDataProps) => {
                   },
                   },
                   onKeyDown: (e: any) => {
                   onKeyDown: (e: any) => {
                     if (e.key === 'Enter') {
                     if (e.key === 'Enter') {
+                      setQueryState({ ...queryState, expr: exprInput });
                       // reset page
                       // reset page
                       setCurrentPage(0);
                       setCurrentPage(0);
-                      if (expr !== queryState.expr) {
-                        setExpr(queryState.expr);
-                      } else {
-                        // ensure query
-                        query();
-                      }
                       e.preventDefault();
                       e.preventDefault();
                     }
                     }
                   },
                   },
@@ -493,12 +497,8 @@ const CollectionData = (props: CollectionDataProps) => {
                 variant="contained"
                 variant="contained"
                 onClick={() => {
                 onClick={() => {
                   setCurrentPage(0);
                   setCurrentPage(0);
-                  if (expr !== queryState.expr) {
-                    setExpr(queryState.expr);
-                  } else {
-                    // ensure query
-                    query();
-                  }
+                  // set expr
+                  setQueryState({ ...queryState, expr: exprInput });
                 }}
                 }}
                 disabled={!collection.loaded}
                 disabled={!collection.loaded}
               >
               >