mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-08-27 18:36:08 +00:00
Add Query builder widget (#18314)
* add query builder widget * locales * add unit tests * add debounce for on change
This commit is contained in:
parent
eeca51cb9a
commit
d39f2d8fe8
@ -14,8 +14,8 @@ import React, { FC } from 'react';
|
|||||||
import { AdvanceSearchProvider } from '../../components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component';
|
import { AdvanceSearchProvider } from '../../components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component';
|
||||||
|
|
||||||
export const withAdvanceSearch =
|
export const withAdvanceSearch =
|
||||||
(Component: FC) =>
|
<P extends Record<string, unknown>>(Component: FC<P>) =>
|
||||||
(props: JSX.IntrinsicAttributes & { children?: React.ReactNode }) => {
|
(props: P) => {
|
||||||
return (
|
return (
|
||||||
<AdvanceSearchProvider>
|
<AdvanceSearchProvider>
|
||||||
<Component {...props} />
|
<Component {...props} />
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Collate.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
export enum QueryBuilderOutputType {
|
||||||
|
ELASTICSEARCH = 'elasticsearch',
|
||||||
|
JSON_LOGIC = 'jsonlogic',
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Collate.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { Registry } from '@rjsf/utils';
|
||||||
|
import { render, screen } from '@testing-library/react';
|
||||||
|
import React from 'react';
|
||||||
|
import { BasicConfig } from 'react-awesome-query-builder';
|
||||||
|
import AntdConfig from 'react-awesome-query-builder/lib/config/antd';
|
||||||
|
import QueryBuilderWidget from './QueryBuilderWidget';
|
||||||
|
|
||||||
|
const mockOnFocus = jest.fn();
|
||||||
|
const mockOnBlur = jest.fn();
|
||||||
|
const mockOnChange = jest.fn();
|
||||||
|
const baseConfig = AntdConfig as BasicConfig;
|
||||||
|
|
||||||
|
jest.mock(
|
||||||
|
'../../../../../Explore/AdvanceSearchProvider/AdvanceSearchProvider.component',
|
||||||
|
() => ({
|
||||||
|
AdvanceSearchProvider: ({ children }: { children: React.ReactNode }) => (
|
||||||
|
<div data-testid="advance-search-provider-mock">{children}</div>
|
||||||
|
),
|
||||||
|
useAdvanceSearch: jest.fn().mockImplementation(() => ({
|
||||||
|
toggleModal: jest.fn(),
|
||||||
|
sqlQuery: '',
|
||||||
|
onResetAllFilters: jest.fn(),
|
||||||
|
onChangeSearchIndex: jest.fn(),
|
||||||
|
config: {
|
||||||
|
...baseConfig,
|
||||||
|
fields: {},
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
jest.mock('react-router-dom', () => ({
|
||||||
|
useLocation: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
const mockProps = {
|
||||||
|
onFocus: mockOnFocus,
|
||||||
|
onBlur: mockOnBlur,
|
||||||
|
onChange: mockOnChange,
|
||||||
|
registry: {} as Registry,
|
||||||
|
schema: {
|
||||||
|
description: 'this is query builder field',
|
||||||
|
title: 'rules',
|
||||||
|
format: 'queryBuilder',
|
||||||
|
entityType: 'table',
|
||||||
|
},
|
||||||
|
value: '',
|
||||||
|
id: 'root/queryBuilder',
|
||||||
|
label: 'Query Builder',
|
||||||
|
name: 'queryBuilder',
|
||||||
|
options: {
|
||||||
|
enumOptions: [],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('QueryBuilderWidget', () => {
|
||||||
|
it('should render the query builder', () => {
|
||||||
|
render(<QueryBuilderWidget {...mockProps} />);
|
||||||
|
const builder = screen.getByTestId('query-builder-form-field');
|
||||||
|
|
||||||
|
expect(builder).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Collate.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import { InfoCircleOutlined } from '@ant-design/icons';
|
||||||
|
import { WidgetProps } from '@rjsf/utils';
|
||||||
|
import { Alert, Button, Col, Typography } from 'antd';
|
||||||
|
import { t } from 'i18next';
|
||||||
|
import { debounce, isEmpty, isUndefined } from 'lodash';
|
||||||
|
import Qs from 'qs';
|
||||||
|
import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
|
import {
|
||||||
|
Builder,
|
||||||
|
Config,
|
||||||
|
ImmutableTree,
|
||||||
|
Query,
|
||||||
|
Utils as QbUtils,
|
||||||
|
} from 'react-awesome-query-builder';
|
||||||
|
import { getExplorePath } from '../../../../../../constants/constants';
|
||||||
|
import { EntityType } from '../../../../../../enums/entity.enum';
|
||||||
|
import { SearchIndex } from '../../../../../../enums/search.enum';
|
||||||
|
import { searchQuery } from '../../../../../../rest/searchAPI';
|
||||||
|
import searchClassBase from '../../../../../../utils/SearchClassBase';
|
||||||
|
import { withAdvanceSearch } from '../../../../../AppRouter/withAdvanceSearch';
|
||||||
|
import { useAdvanceSearch } from '../../../../../Explore/AdvanceSearchProvider/AdvanceSearchProvider.component';
|
||||||
|
import './query-builder-widget.less';
|
||||||
|
import { QueryBuilderOutputType } from './QueryBuilderWidget.interface';
|
||||||
|
|
||||||
|
const QueryBuilderWidget: FC<WidgetProps> = ({
|
||||||
|
onChange,
|
||||||
|
schema,
|
||||||
|
value,
|
||||||
|
...props
|
||||||
|
}: WidgetProps) => {
|
||||||
|
const { config, treeInternal, onTreeUpdate, onChangeSearchIndex } =
|
||||||
|
useAdvanceSearch();
|
||||||
|
const [searchResults, setSearchResults] = useState<number>(0);
|
||||||
|
const entityType =
|
||||||
|
(props.formContext?.entityType ?? props?.entityType) || EntityType.ALL;
|
||||||
|
const searchIndexMapping = searchClassBase.getEntityTypeSearchIndexMapping();
|
||||||
|
const searchIndex = searchIndexMapping[entityType as string];
|
||||||
|
const outputType = props?.outputType ?? QueryBuilderOutputType.ELASTICSEARCH;
|
||||||
|
|
||||||
|
const fetchEntityCount = useCallback(
|
||||||
|
async (queryFilter: Record<string, unknown>) => {
|
||||||
|
try {
|
||||||
|
const res = await searchQuery({
|
||||||
|
query: '',
|
||||||
|
pageNumber: 0,
|
||||||
|
pageSize: 0,
|
||||||
|
queryFilter,
|
||||||
|
searchIndex: SearchIndex.ALL,
|
||||||
|
includeDeleted: false,
|
||||||
|
trackTotalHits: true,
|
||||||
|
fetchSource: false,
|
||||||
|
});
|
||||||
|
setSearchResults(res.hits.total.value ?? 0);
|
||||||
|
} catch (_) {
|
||||||
|
// silent fail
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
const debouncedFetchEntityCount = useMemo(
|
||||||
|
() => debounce(fetchEntityCount, 300),
|
||||||
|
[fetchEntityCount]
|
||||||
|
);
|
||||||
|
|
||||||
|
const queryURL = useMemo(() => {
|
||||||
|
const queryFilterString = !isEmpty(treeInternal)
|
||||||
|
? Qs.stringify({ queryFilter: JSON.stringify(treeInternal) })
|
||||||
|
: '';
|
||||||
|
|
||||||
|
return `${getExplorePath({})}${queryFilterString}`;
|
||||||
|
}, [treeInternal]);
|
||||||
|
|
||||||
|
const handleChange = (nTree: ImmutableTree, nConfig: Config) => {
|
||||||
|
onTreeUpdate(nTree, nConfig);
|
||||||
|
|
||||||
|
if (outputType === QueryBuilderOutputType.ELASTICSEARCH) {
|
||||||
|
const data = QbUtils.elasticSearchFormat(nTree, config) ?? {};
|
||||||
|
const qFilter = {
|
||||||
|
query: data,
|
||||||
|
};
|
||||||
|
if (data) {
|
||||||
|
debouncedFetchEntityCount(qFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
onChange(JSON.stringify(qFilter));
|
||||||
|
} else {
|
||||||
|
const data = QbUtils.jsonLogicFormat(nTree, config);
|
||||||
|
onChange(JSON.stringify(data.logic ?? '{}'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
onChangeSearchIndex(searchIndex);
|
||||||
|
}, [searchIndex]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="query-builder-form-field"
|
||||||
|
data-testid="query-builder-form-field">
|
||||||
|
<Query
|
||||||
|
{...config}
|
||||||
|
renderBuilder={(props) => (
|
||||||
|
<div className="query-builder-container query-builder qb-lite">
|
||||||
|
<Builder {...props} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
value={treeInternal}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
|
{outputType === QueryBuilderOutputType.ELASTICSEARCH &&
|
||||||
|
!isUndefined(value) && (
|
||||||
|
<Col span={24}>
|
||||||
|
<Button
|
||||||
|
className="w-full p-0 text-left"
|
||||||
|
data-testid="view-assets-banner-button"
|
||||||
|
disabled={false}
|
||||||
|
href={queryURL}
|
||||||
|
target="_blank"
|
||||||
|
type="link">
|
||||||
|
<Alert
|
||||||
|
closable
|
||||||
|
showIcon
|
||||||
|
icon={<InfoCircleOutlined height={16} />}
|
||||||
|
message={
|
||||||
|
<>
|
||||||
|
<Typography.Text>
|
||||||
|
{t('message.search-entity-count', {
|
||||||
|
count: searchResults,
|
||||||
|
})}
|
||||||
|
</Typography.Text>
|
||||||
|
|
||||||
|
<Typography.Text className="m-l-sm text-xs text-grey-muted">
|
||||||
|
{t('message.click-here-to-view-assets-on-explore')}
|
||||||
|
</Typography.Text>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
type="info"
|
||||||
|
/>
|
||||||
|
</Button>
|
||||||
|
</Col>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default withAdvanceSearch(QueryBuilderWidget);
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2024 Collate.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
.query-builder-form-field {
|
||||||
|
.hide--line.one--child {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group.rule_group {
|
||||||
|
border: none !important;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.group--children {
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.group--field {
|
||||||
|
width: 180px;
|
||||||
|
|
||||||
|
.ant-select {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -27,6 +27,7 @@ import { FieldErrorTemplate } from '../Form/JSONSchema/JSONSchemaTemplate/FieldE
|
|||||||
import { ObjectFieldTemplate } from '../Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate';
|
import { ObjectFieldTemplate } from '../Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate';
|
||||||
import AsyncSelectWidget from '../Form/JSONSchema/JsonSchemaWidgets/AsyncSelectWidget';
|
import AsyncSelectWidget from '../Form/JSONSchema/JsonSchemaWidgets/AsyncSelectWidget';
|
||||||
import PasswordWidget from '../Form/JSONSchema/JsonSchemaWidgets/PasswordWidget';
|
import PasswordWidget from '../Form/JSONSchema/JsonSchemaWidgets/PasswordWidget';
|
||||||
|
import QueryBuilderWidget from '../Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget';
|
||||||
import SelectWidget from '../Form/JSONSchema/JsonSchemaWidgets/SelectWidget';
|
import SelectWidget from '../Form/JSONSchema/JsonSchemaWidgets/SelectWidget';
|
||||||
import Loader from '../Loader/Loader';
|
import Loader from '../Loader/Loader';
|
||||||
|
|
||||||
@ -70,6 +71,7 @@ const FormBuilder: FunctionComponent<Props> = forwardRef(
|
|||||||
const widgets = {
|
const widgets = {
|
||||||
PasswordWidget: PasswordWidget,
|
PasswordWidget: PasswordWidget,
|
||||||
autoComplete: AsyncSelectWidget,
|
autoComplete: AsyncSelectWidget,
|
||||||
|
queryBuilder: QueryBuilderWidget,
|
||||||
...(useSelectWidget && { SelectWidget: SelectWidget }),
|
...(useSelectWidget && { SelectWidget: SelectWidget }),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
||||||
"can-you-add-a-description": "Können Sie eine Beschreibung hinzufügen?",
|
"can-you-add-a-description": "Können Sie eine Beschreibung hinzufügen?",
|
||||||
"checkout-service-connectors-doc": "Es gibt viele Konnektoren hier, um Daten von Ihren Diensten zu indizieren. Bitte schauen Sie sich unsere Konnektoren an.",
|
"checkout-service-connectors-doc": "Es gibt viele Konnektoren hier, um Daten von Ihren Diensten zu indizieren. Bitte schauen Sie sich unsere Konnektoren an.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Klicken Sie auf <0>{{text}}</0>, um Details anzuzeigen.",
|
"click-text-to-view-details": "Klicken Sie auf <0>{{text}}</0>, um Details anzuzeigen.",
|
||||||
"closed-this-task": "hat diese Aufgabe geschlossen",
|
"closed-this-task": "hat diese Aufgabe geschlossen",
|
||||||
"collaborate-with-other-user": "um mit anderen Benutzern zusammenzuarbeiten.",
|
"collaborate-with-other-user": "um mit anderen Benutzern zusammenzuarbeiten.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "Die Planung kann im stündlichen, täglichen oder wöchentlichen Rhythmus eingerichtet werden. Die Zeitzone ist UTC.",
|
"schedule-for-ingestion-description": "Die Planung kann im stündlichen, täglichen oder wöchentlichen Rhythmus eingerichtet werden. Die Zeitzone ist UTC.",
|
||||||
"scheduled-run-every": "Geplant, alle auszuführen",
|
"scheduled-run-every": "Geplant, alle auszuführen",
|
||||||
"scopes-comma-separated": "Fügen Sie den Wert der Bereiche hinzu, getrennt durch Kommata",
|
"scopes-comma-separated": "Fügen Sie den Wert der Bereiche hinzu, getrennt durch Kommata",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Suche nach Pipeline, StoredProcedures",
|
"search-for-edge": "Suche nach Pipeline, StoredProcedures",
|
||||||
"search-for-entity-types": "Suche nach Tabellen, Themen, Dashboards, Pipelines, ML-Modellen, Glossar und Tags.",
|
"search-for-entity-types": "Suche nach Tabellen, Themen, Dashboards, Pipelines, ML-Modellen, Glossar und Tags.",
|
||||||
"search-for-ingestion": "Suche nach Ingestion",
|
"search-for-ingestion": "Suche nach Ingestion",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
||||||
"can-you-add-a-description": "Can you add a description?",
|
"can-you-add-a-description": "Can you add a description?",
|
||||||
"checkout-service-connectors-doc": "There are a lot of connectors available here to index data from your services. Please checkout our connectors.",
|
"checkout-service-connectors-doc": "There are a lot of connectors available here to index data from your services. Please checkout our connectors.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Click <0>{{text}}</0> to view details.",
|
"click-text-to-view-details": "Click <0>{{text}}</0> to view details.",
|
||||||
"closed-this-task": "closed this task",
|
"closed-this-task": "closed this task",
|
||||||
"collaborate-with-other-user": "to collaborate with other users.",
|
"collaborate-with-other-user": "to collaborate with other users.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.",
|
"schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.",
|
||||||
"scheduled-run-every": "Scheduled to run every",
|
"scheduled-run-every": "Scheduled to run every",
|
||||||
"scopes-comma-separated": "Add the Scopes value, separated by commas",
|
"scopes-comma-separated": "Add the Scopes value, separated by commas",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Search for Pipeline, StoredProcedures",
|
"search-for-edge": "Search for Pipeline, StoredProcedures",
|
||||||
"search-for-entity-types": "Search for Tables, Topics, Dashboards, Pipelines, ML Models, Glossary and Tags.",
|
"search-for-entity-types": "Search for Tables, Topics, Dashboards, Pipelines, ML Models, Glossary and Tags.",
|
||||||
"search-for-ingestion": "Search for ingestion",
|
"search-for-ingestion": "Search for ingestion",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "No se puede agregar el widget a esta sección debido a restricciones de tamaño.",
|
"can-not-add-widget": "No se puede agregar el widget a esta sección debido a restricciones de tamaño.",
|
||||||
"can-you-add-a-description": "¿Puedes agregar una descripción?",
|
"can-you-add-a-description": "¿Puedes agregar una descripción?",
|
||||||
"checkout-service-connectors-doc": "Hay muchos conectores disponibles para ingesta de datos de tus servicios. Por favor, revisa nuestra documentación sobre conectores.",
|
"checkout-service-connectors-doc": "Hay muchos conectores disponibles para ingesta de datos de tus servicios. Por favor, revisa nuestra documentación sobre conectores.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Haz clic en <0>{{text}}</0> para ver detalles.",
|
"click-text-to-view-details": "Haz clic en <0>{{text}}</0> para ver detalles.",
|
||||||
"closed-this-task": "cerró esta tarea",
|
"closed-this-task": "cerró esta tarea",
|
||||||
"collaborate-with-other-user": "para colaborar con otros usuarios.",
|
"collaborate-with-other-user": "para colaborar con otros usuarios.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "La programación se puede configurar en una cadencia horaria, diaria o semanal.",
|
"schedule-for-ingestion-description": "La programación se puede configurar en una cadencia horaria, diaria o semanal.",
|
||||||
"scheduled-run-every": "Programado para ejecutarse cada",
|
"scheduled-run-every": "Programado para ejecutarse cada",
|
||||||
"scopes-comma-separated": "Agrega el valor de ámbitos, separados por comas",
|
"scopes-comma-separated": "Agrega el valor de ámbitos, separados por comas",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Buscar Pipeline, StoredProcedures",
|
"search-for-edge": "Buscar Pipeline, StoredProcedures",
|
||||||
"search-for-entity-types": "Buscar Tablas, Temas, Paneles, Pipelines, Modelos de ML, Glosarios y Etiquetas.",
|
"search-for-entity-types": "Buscar Tablas, Temas, Paneles, Pipelines, Modelos de ML, Glosarios y Etiquetas.",
|
||||||
"search-for-ingestion": "Buscar orígenes de datos",
|
"search-for-ingestion": "Buscar orígenes de datos",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Le widget ne peut être ajouté à cette section à cause des restrictions de taille.$",
|
"can-not-add-widget": "Le widget ne peut être ajouté à cette section à cause des restrictions de taille.$",
|
||||||
"can-you-add-a-description": "Pouvez-vous ajouter une description?",
|
"can-you-add-a-description": "Pouvez-vous ajouter une description?",
|
||||||
"checkout-service-connectors-doc": "Il y a de nombreux connecteurs disponibles ici pour indexer les données de vos services. Veuillez consulter nos connecteurs.",
|
"checkout-service-connectors-doc": "Il y a de nombreux connecteurs disponibles ici pour indexer les données de vos services. Veuillez consulter nos connecteurs.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Cliquez sur <0>{{text}}</0> pour voir les détails.",
|
"click-text-to-view-details": "Cliquez sur <0>{{text}}</0> pour voir les détails.",
|
||||||
"closed-this-task": "fermer cette tâche",
|
"closed-this-task": "fermer cette tâche",
|
||||||
"collaborate-with-other-user": "pour collaborer avec d'autres utilisateurs.",
|
"collaborate-with-other-user": "pour collaborer avec d'autres utilisateurs.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "La programmation peut être configurée à une cadence horaire, quotidienne ou hebdomadaire. Le fuseau horaire est en UTC.",
|
"schedule-for-ingestion-description": "La programmation peut être configurée à une cadence horaire, quotidienne ou hebdomadaire. Le fuseau horaire est en UTC.",
|
||||||
"scheduled-run-every": "Programmer pour être exécuté tous les",
|
"scheduled-run-every": "Programmer pour être exécuté tous les",
|
||||||
"scopes-comma-separated": "Liste de scopes séparée par une virgule.",
|
"scopes-comma-separated": "Liste de scopes séparée par une virgule.",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Rechercher Pipeline, Procédures Stockées",
|
"search-for-edge": "Rechercher Pipeline, Procédures Stockées",
|
||||||
"search-for-entity-types": "Rechercher Tables, Topics, Tableaux de Bord, Pipelines et Modèles d'IA",
|
"search-for-entity-types": "Rechercher Tables, Topics, Tableaux de Bord, Pipelines et Modèles d'IA",
|
||||||
"search-for-ingestion": "Rechercher une ingestion",
|
"search-for-ingestion": "Rechercher une ingestion",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "לא ניתן להוסיף את הווידג'ט לסקשן זה עקב הגבלות בגודל.",
|
"can-not-add-widget": "לא ניתן להוסיף את הווידג'ט לסקשן זה עקב הגבלות בגודל.",
|
||||||
"can-you-add-a-description": "האם תוכל להוסיף תיאור?",
|
"can-you-add-a-description": "האם תוכל להוסיף תיאור?",
|
||||||
"checkout-service-connectors-doc": "ישנם חיבורים רבים כאן זמינים לאינדקסציה של נתונים מהשירותים שלך. בדוק את החיבורים שלנו.",
|
"checkout-service-connectors-doc": "ישנם חיבורים רבים כאן זמינים לאינדקסציה של נתונים מהשירותים שלך. בדוק את החיבורים שלנו.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "לחץ על <0>{{text}}</0> לצפייה בפרטים.",
|
"click-text-to-view-details": "לחץ על <0>{{text}}</0> לצפייה בפרטים.",
|
||||||
"closed-this-task": "סגר משימה זו",
|
"closed-this-task": "סגר משימה זו",
|
||||||
"collaborate-with-other-user": "לשתף פעולה עם משתמשים אחרים.",
|
"collaborate-with-other-user": "לשתף פעולה עם משתמשים אחרים.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "ניתן להגדיר שימוש כל שעה, יומית או שבועית. אזור הזמן הוא UTC.",
|
"schedule-for-ingestion-description": "ניתן להגדיר שימוש כל שעה, יומית או שבועית. אזור הזמן הוא UTC.",
|
||||||
"scheduled-run-every": "מתוזמן לרוץ כל",
|
"scheduled-run-every": "מתוזמן לרוץ כל",
|
||||||
"scopes-comma-separated": "הוסף את ערכי הניקוד, מופרדים בפסיקים",
|
"scopes-comma-separated": "הוסף את ערכי הניקוד, מופרדים בפסיקים",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "חיפוש לפי תהליך טעינה, פונקציות מאוחסנות",
|
"search-for-edge": "חיפוש לפי תהליך טעינה, פונקציות מאוחסנות",
|
||||||
"search-for-entity-types": "חיפוש לפי טבלאות, נושאים, דשבורדים, תהליכי טעינה, מודלי למידת מכונה, מילוני מונחים ותגיות",
|
"search-for-entity-types": "חיפוש לפי טבלאות, נושאים, דשבורדים, תהליכי טעינה, מודלי למידת מכונה, מילוני מונחים ותגיות",
|
||||||
"search-for-ingestion": "חיפוש תהליך טעינה (Ingestion)",
|
"search-for-ingestion": "חיפוש תהליך טעינה (Ingestion)",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
||||||
"can-you-add-a-description": "説明を追加できますか?",
|
"can-you-add-a-description": "説明を追加できますか?",
|
||||||
"checkout-service-connectors-doc": "There are a lot of connectors available here to index data from your services. Please checkout our connectors.",
|
"checkout-service-connectors-doc": "There are a lot of connectors available here to index data from your services. Please checkout our connectors.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Click <0>{{text}}</0> to view details.",
|
"click-text-to-view-details": "Click <0>{{text}}</0> to view details.",
|
||||||
"closed-this-task": "このタスクを閉じました",
|
"closed-this-task": "このタスクを閉じました",
|
||||||
"collaborate-with-other-user": "to collaborate with other users.",
|
"collaborate-with-other-user": "to collaborate with other users.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.",
|
"schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.",
|
||||||
"scheduled-run-every": "Scheduled to run every",
|
"scheduled-run-every": "Scheduled to run every",
|
||||||
"scopes-comma-separated": "スコープの値をカンマで区切って追加",
|
"scopes-comma-separated": "スコープの値をカンマで区切って追加",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Search for Pipeline, StoredProcedures",
|
"search-for-edge": "Search for Pipeline, StoredProcedures",
|
||||||
"search-for-entity-types": "テーブル、トピック、ダッシュボード、パイプライン、MLモデルの検索。",
|
"search-for-entity-types": "テーブル、トピック、ダッシュボード、パイプライン、MLモデルの検索。",
|
||||||
"search-for-ingestion": "Search for ingestion",
|
"search-for-ingestion": "Search for ingestion",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Kan de widget niet toevoegen aan deze sectie vanwege beperkingen in grootte.",
|
"can-not-add-widget": "Kan de widget niet toevoegen aan deze sectie vanwege beperkingen in grootte.",
|
||||||
"can-you-add-a-description": "Kunt u een beschrijving toevoegen?",
|
"can-you-add-a-description": "Kunt u een beschrijving toevoegen?",
|
||||||
"checkout-service-connectors-doc": "Er zijn hier veel connectors beschikbaar om data van uw services te indexeren. Bekijk onze connectors.",
|
"checkout-service-connectors-doc": "Er zijn hier veel connectors beschikbaar om data van uw services te indexeren. Bekijk onze connectors.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Klik op <0>{{text}}</0> om details te bekijken.",
|
"click-text-to-view-details": "Klik op <0>{{text}}</0> om details te bekijken.",
|
||||||
"closed-this-task": "heeft deze taak gesloten",
|
"closed-this-task": "heeft deze taak gesloten",
|
||||||
"collaborate-with-other-user": "om samen te werken met andere gebruikers.",
|
"collaborate-with-other-user": "om samen te werken met andere gebruikers.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "Planning kan worden ingesteld op een uurlijkse, dagelijkse of wekelijkse cadans. De tijdzone is in UTC.",
|
"schedule-for-ingestion-description": "Planning kan worden ingesteld op een uurlijkse, dagelijkse of wekelijkse cadans. De tijdzone is in UTC.",
|
||||||
"scheduled-run-every": "Gepland om elke keer uit te voeren",
|
"scheduled-run-every": "Gepland om elke keer uit te voeren",
|
||||||
"scopes-comma-separated": "Voeg de herkomstwaarde toe, gescheiden door komma's",
|
"scopes-comma-separated": "Voeg de herkomstwaarde toe, gescheiden door komma's",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Zoeken naar Pipeline, Stored Procedures",
|
"search-for-edge": "Zoeken naar Pipeline, Stored Procedures",
|
||||||
"search-for-entity-types": "Zoeken naar Tabellen, Onderwerpen, Dashboards, Pipelines, ML-modellen, Woordenlijst en Tags.",
|
"search-for-entity-types": "Zoeken naar Tabellen, Onderwerpen, Dashboards, Pipelines, ML-modellen, Woordenlijst en Tags.",
|
||||||
"search-for-ingestion": "Zoeken naar ingestie",
|
"search-for-ingestion": "Zoeken naar ingestie",
|
||||||
|
@ -1394,6 +1394,7 @@
|
|||||||
"can-not-add-widget": "به دلیل محدودیتهای اندازه، نمیتوان ویجت را به این بخش اضافه کرد.",
|
"can-not-add-widget": "به دلیل محدودیتهای اندازه، نمیتوان ویجت را به این بخش اضافه کرد.",
|
||||||
"can-you-add-a-description": "آیا میتوانید توضیحی اضافه کنید؟",
|
"can-you-add-a-description": "آیا میتوانید توضیحی اضافه کنید؟",
|
||||||
"checkout-service-connectors-doc": "اینجا تعدادی از اتصالات برای ایندکس کردن دادهها از خدمات خود موجود است. لطفاً مستندات ما را بررسی کنید.",
|
"checkout-service-connectors-doc": "اینجا تعدادی از اتصالات برای ایندکس کردن دادهها از خدمات خود موجود است. لطفاً مستندات ما را بررسی کنید.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "برای مشاهده جزئیات، روی <0>{{text}}</0> کلیک کنید.",
|
"click-text-to-view-details": "برای مشاهده جزئیات، روی <0>{{text}}</0> کلیک کنید.",
|
||||||
"closed-this-task": "این وظیفه را بست.",
|
"closed-this-task": "این وظیفه را بست.",
|
||||||
"collaborate-with-other-user": "برای همکاری با کاربران دیگر.",
|
"collaborate-with-other-user": "برای همکاری با کاربران دیگر.",
|
||||||
@ -1780,6 +1781,7 @@
|
|||||||
"schedule-for-ingestion-description": "برنامهریزی میتواند به صورت ساعتی، روزانه یا هفتگی تنظیم شود. منطقه زمانی UTC است.",
|
"schedule-for-ingestion-description": "برنامهریزی میتواند به صورت ساعتی، روزانه یا هفتگی تنظیم شود. منطقه زمانی UTC است.",
|
||||||
"scheduled-run-every": "برنامهریزی شده برای اجرا هر",
|
"scheduled-run-every": "برنامهریزی شده برای اجرا هر",
|
||||||
"scopes-comma-separated": "مقدار Scopes را با کاما جدا کنید.",
|
"scopes-comma-separated": "مقدار Scopes را با کاما جدا کنید.",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "جستجوی خطوط لوله، StoredProcedures.",
|
"search-for-edge": "جستجوی خطوط لوله، StoredProcedures.",
|
||||||
"search-for-entity-types": "جستجوی جداول، موضوعات، داشبوردها، خطوط لوله، مدلهای ML، واژهنامه و برچسبها.",
|
"search-for-entity-types": "جستجوی جداول، موضوعات، داشبوردها، خطوط لوله، مدلهای ML، واژهنامه و برچسبها.",
|
||||||
"search-for-ingestion": "جستجوی ورود داده.",
|
"search-for-ingestion": "جستجوی ورود داده.",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Não é possível adicionar o widget a esta seção devido a restrições de tamanho.",
|
"can-not-add-widget": "Não é possível adicionar o widget a esta seção devido a restrições de tamanho.",
|
||||||
"can-you-add-a-description": "Você pode adicionar uma descrição?",
|
"can-you-add-a-description": "Você pode adicionar uma descrição?",
|
||||||
"checkout-service-connectors-doc": "Há muitos conectores disponíveis aqui para indexar dados de seus serviços. Por favor, confira nossos conectores.",
|
"checkout-service-connectors-doc": "Há muitos conectores disponíveis aqui para indexar dados de seus serviços. Por favor, confira nossos conectores.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Clique em <0>{{text}}</0> para ver detalhes.",
|
"click-text-to-view-details": "Clique em <0>{{text}}</0> para ver detalhes.",
|
||||||
"closed-this-task": "fechou esta tarefa",
|
"closed-this-task": "fechou esta tarefa",
|
||||||
"collaborate-with-other-user": "para colaborar com outros usuários.",
|
"collaborate-with-other-user": "para colaborar com outros usuários.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "O agendamento pode ser configurado em uma frequência horária, diária ou semanal. O fuso horário é em UTC.",
|
"schedule-for-ingestion-description": "O agendamento pode ser configurado em uma frequência horária, diária ou semanal. O fuso horário é em UTC.",
|
||||||
"scheduled-run-every": "Agendado para rodar a cada",
|
"scheduled-run-every": "Agendado para rodar a cada",
|
||||||
"scopes-comma-separated": "Adicione o valor dos Escopos, separados por vírgulas",
|
"scopes-comma-separated": "Adicione o valor dos Escopos, separados por vírgulas",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Pesquisar por Pipeline, StoredProcedures",
|
"search-for-edge": "Pesquisar por Pipeline, StoredProcedures",
|
||||||
"search-for-entity-types": "Pesquisar por Tabelas, Tópicos, Painéis, Pipelines, Modelos de ML, Glossário e Tags.",
|
"search-for-entity-types": "Pesquisar por Tabelas, Tópicos, Painéis, Pipelines, Modelos de ML, Glossário e Tags.",
|
||||||
"search-for-ingestion": "Pesquisar por ingestão",
|
"search-for-ingestion": "Pesquisar por ingestão",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
||||||
"can-you-add-a-description": "Можете добавить описание?",
|
"can-you-add-a-description": "Можете добавить описание?",
|
||||||
"checkout-service-connectors-doc": "Здесь доступно множество коннекторов для индексации данных из ваших сервисов. Пожалуйста, ознакомьтесь с нашими коннекторами.",
|
"checkout-service-connectors-doc": "Здесь доступно множество коннекторов для индексации данных из ваших сервисов. Пожалуйста, ознакомьтесь с нашими коннекторами.",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "Нажмите <0>{{text}}</0>, чтобы просмотреть подробности.",
|
"click-text-to-view-details": "Нажмите <0>{{text}}</0>, чтобы просмотреть подробности.",
|
||||||
"closed-this-task": "задача закрыта",
|
"closed-this-task": "задача закрыта",
|
||||||
"collaborate-with-other-user": "для совместной работы с другими пользователями.",
|
"collaborate-with-other-user": "для совместной работы с другими пользователями.",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "Планирование может быть настроено на почасовой, ежедневной или еженедельной частоте. Часовой пояс указан в формате UTC.",
|
"schedule-for-ingestion-description": "Планирование может быть настроено на почасовой, ежедневной или еженедельной частоте. Часовой пояс указан в формате UTC.",
|
||||||
"scheduled-run-every": "Запланирован запуск каждый",
|
"scheduled-run-every": "Запланирован запуск каждый",
|
||||||
"scopes-comma-separated": "Добавьте значение областей, разделенное запятыми",
|
"scopes-comma-separated": "Добавьте значение областей, разделенное запятыми",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "Search for Pipeline, StoredProcedures",
|
"search-for-edge": "Search for Pipeline, StoredProcedures",
|
||||||
"search-for-entity-types": "Поиск по таблицам, топикам, дашбордам, пайплайнам, моделям машинного обучения, глоссарию и тегам.",
|
"search-for-entity-types": "Поиск по таблицам, топикам, дашбордам, пайплайнам, моделям машинного обучения, глоссарию и тегам.",
|
||||||
"search-for-ingestion": "Поиск для получения",
|
"search-for-ingestion": "Поиск для получения",
|
||||||
|
@ -1384,6 +1384,7 @@
|
|||||||
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
"can-not-add-widget": "Can not add the widget to this section due to size restrictions.",
|
||||||
"can-you-add-a-description": "您能添加一些描述吗?",
|
"can-you-add-a-description": "您能添加一些描述吗?",
|
||||||
"checkout-service-connectors-doc": "我们已经预置了很多连接器, 可用于索引您的各项服务数据",
|
"checkout-service-connectors-doc": "我们已经预置了很多连接器, 可用于索引您的各项服务数据",
|
||||||
|
"click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)",
|
||||||
"click-text-to-view-details": "点击<0>{{text}}</0>查看详情",
|
"click-text-to-view-details": "点击<0>{{text}}</0>查看详情",
|
||||||
"closed-this-task": "关闭了此任务",
|
"closed-this-task": "关闭了此任务",
|
||||||
"collaborate-with-other-user": "与其他用户协作",
|
"collaborate-with-other-user": "与其他用户协作",
|
||||||
@ -1772,6 +1773,7 @@
|
|||||||
"schedule-for-ingestion-description": "可设置每小时、每天或每周的计划, 时区为 UTC",
|
"schedule-for-ingestion-description": "可设置每小时、每天或每周的计划, 时区为 UTC",
|
||||||
"scheduled-run-every": "计划每次运行",
|
"scheduled-run-every": "计划每次运行",
|
||||||
"scopes-comma-separated": "范围值逗号分隔",
|
"scopes-comma-separated": "范围值逗号分隔",
|
||||||
|
"search-entity-count": "{{count}} assets have been found with this filter.",
|
||||||
"search-for-edge": "搜索工作流、存储过程",
|
"search-for-edge": "搜索工作流、存储过程",
|
||||||
"search-for-entity-types": "搜索数据表、消息主题、仪表板、工作流和机械学习模型",
|
"search-for-entity-types": "搜索数据表、消息主题、仪表板、工作流和机械学习模型",
|
||||||
"search-for-ingestion": "搜索提取作业",
|
"search-for-ingestion": "搜索提取作业",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user