remult 0.27.20-next.0 → 0.27.20-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { queryConfig } from '../context.js';
|
|
2
|
-
import { isOfType } from '../isOfType.js';
|
|
3
2
|
import { Sort } from '../sort.js';
|
|
4
3
|
import { RelationLoader } from './relation-loader.js';
|
|
5
4
|
export class QueryResultImpl {
|
|
@@ -53,8 +52,11 @@ export class QueryResultImpl {
|
|
|
53
52
|
include: this.options.include,
|
|
54
53
|
};
|
|
55
54
|
let getItems = () => this.repo.find(options);
|
|
56
|
-
if (this._aggregates === undefined &&
|
|
57
|
-
|
|
55
|
+
if (this._aggregates === undefined /* &&
|
|
56
|
+
(isOfType<QueryOptions<entityType, any, any, any, any, any>>(
|
|
57
|
+
this.options,
|
|
58
|
+
'aggregate',
|
|
59
|
+
))*/) {
|
|
58
60
|
let agg = this.options.aggregate;
|
|
59
61
|
if (!this.repo._dataProvider.isProxy) {
|
|
60
62
|
let itemsPromise = getItems();
|
package/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { ClassType } from './classType.js';
|
|
|
2
2
|
import type { DataProvider } from './src/data-interfaces.js';
|
|
3
3
|
export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider.js';
|
|
4
4
|
export type { ClassType } from './classType.js';
|
|
5
|
-
export { ValidateFieldEvent, MembersOnly, FieldsMetadata, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, FindOptionsBase, QueryResult,
|
|
5
|
+
export { ValidateFieldEvent, MembersOnly, FieldsMetadata, FieldRef, IdFieldRef, FieldsRef, EntityMetadata, EntityOrderBy, EntityFilter, FindOptions, FindOptionsBase, QueryResult, QueryOptions, Repository, GroupByOptions, FindFirstOptions, ComparisonValueFilter, ValueFilter, IdFilter, ContainsStringValueFilter, EntityRef, SortSegments, Paginator, LiveQuery, LiveQueryChangeInfo, Subscribable, RefSubscriber, RefSubscriberBase, RelationOptions, ObjectMembersOnly, MembersToInclude, RepositoryRelations, EntityIdFields, ClassFieldDecorator, ClassFieldDecoratorContextStub, //n1 consider removing in ts5
|
|
6
6
|
LifecycleEvent, FieldsRefBase, FieldsRefForEntityBase, RepositoryRelationsForEntityBase, ControllerRefForControllerBase, ControllerRefBase, ControllerRef, EntityRefForEntityBase, IdMetadata, FindFirstOptionsBase, } from './src/remult3/remult3.js';
|
|
7
7
|
export { EntityBase, ControllerBase, FieldType, getFields, ValueListFieldType, getValueList, ValueListFieldOptions, ValueListInfo, CaptionTransformer, } from './src/remult3/RepositoryImplementation.js';
|
|
8
8
|
export { Entity } from './src/remult3/entity.js';
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@ import type { RepositoryImplementation } from './RepositoryImplementation.js';
|
|
|
3
3
|
export declare class QueryResultImpl<entityType> implements QueryResult<entityType> {
|
|
4
4
|
private options;
|
|
5
5
|
private repo;
|
|
6
|
-
constructor(options: QueryOptions<entityType>, repo: RepositoryImplementation<entityType>);
|
|
6
|
+
constructor(options: QueryOptions<entityType, any, any, any, any, any>, repo: RepositoryImplementation<entityType>);
|
|
7
7
|
private _count;
|
|
8
8
|
private _aggregates;
|
|
9
9
|
getPage(page?: number): Promise<entityType[]>;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.QueryResultImpl = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var context_js_1 = require("../context.js");
|
|
6
|
-
var isOfType_js_1 = require("../isOfType.js");
|
|
7
6
|
var sort_js_1 = require("../sort.js");
|
|
8
7
|
var relation_loader_js_1 = require("./relation-loader.js");
|
|
9
8
|
var QueryResultImpl = /** @class */ (function () {
|
|
@@ -117,8 +116,11 @@ var QueryResultImpl = /** @class */ (function () {
|
|
|
117
116
|
include: this.options.include,
|
|
118
117
|
};
|
|
119
118
|
getItems = function () { return _this.repo.find(options); };
|
|
120
|
-
if (this._aggregates === undefined &&
|
|
121
|
-
|
|
119
|
+
if (this._aggregates === undefined /* &&
|
|
120
|
+
(isOfType<QueryOptions<entityType, any, any, any, any, any>>(
|
|
121
|
+
this.options,
|
|
122
|
+
'aggregate',
|
|
123
|
+
))*/) {
|
|
122
124
|
agg_1 = this.options.aggregate;
|
|
123
125
|
if (!this.repo._dataProvider.isProxy) {
|
|
124
126
|
itemsPromise_1 = getItems();
|
|
@@ -5,7 +5,7 @@ import { Remult } from '../context.js';
|
|
|
5
5
|
import type { EntityOptions } from '../entity.js';
|
|
6
6
|
import { Filter } from '../filter/filter-interfaces.js';
|
|
7
7
|
import { type GroupByOptions, type GroupByResult, type ControllerRef, type ControllerRefForControllerBase, type EntityFilter, type EntityMetadata, type EntityOrderBy, type EntityRef, type EntityRefForEntityBase, type FieldRef, type FieldsMetadata, type FieldsRef, type FieldsRefForEntityBase, type FindFirstOptions, type FindFirstOptionsBase, type FindOptions, type IdMetadata, type LiveQuery, type LoadOptions, type MembersOnly, type NumericKeys, type Repository, type RepositoryRelations, type Subscribable, type idType } from './remult3.js';
|
|
8
|
-
import type { QueryOptions,
|
|
8
|
+
import type { QueryOptions, QueryResult, RefSubscriber } from './remult3.js';
|
|
9
9
|
import type { entityEventListener } from '../__EntityValueProvider.js';
|
|
10
10
|
import type { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo } from '../data-interfaces.js';
|
|
11
11
|
import type { Unsubscribe } from '../live-query/SubscriptionChannel.js';
|
|
@@ -42,8 +42,7 @@ export declare class RepositoryImplementation<entityType> implements Repository<
|
|
|
42
42
|
get metadata(): EntityMetadata<entityType>;
|
|
43
43
|
listeners?: entityEventListener<entityType>[];
|
|
44
44
|
addEventListener(listener: entityEventListener<entityType>): () => void;
|
|
45
|
-
query(options?: QueryOptions<entityType>): QueryResult<entityType>;
|
|
46
|
-
query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptionsWithAggregates<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResultWithAggregates<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
|
|
45
|
+
query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptions<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResult<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
|
|
47
46
|
getEntityRef(entity: entityType): EntityRef<entityType>;
|
|
48
47
|
delete(id: idType<entityType>): Promise<void>;
|
|
49
48
|
delete(item: Partial<MembersOnly<entityType>>): Promise<void>;
|
package/src/remult3/remult3.d.ts
CHANGED
|
@@ -362,7 +362,7 @@ export type GroupByOptions<entityType, groupByFields extends (keyof MembersOnly<
|
|
|
362
362
|
export declare const GroupByCountMember: "$count";
|
|
363
363
|
export declare const GroupByForApiKey: unique symbol;
|
|
364
364
|
export declare const GroupByOperators: readonly ["sum", "avg", "min", "max", "distinctCount"];
|
|
365
|
-
export type GroupByResult<entityType, groupByFields extends (keyof entityType)[], sumFields extends
|
|
365
|
+
export type GroupByResult<entityType, groupByFields extends (keyof entityType)[], sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends NumericKeys<entityType>[], maxFields extends NumericKeys<entityType>[], distinctCountFields extends (keyof entityType)[]> = {
|
|
366
366
|
[K in groupByFields[number] | sumFields[number]]: K extends groupByFields[number] ? entityType[K] : K extends sumFields[number] ? {
|
|
367
367
|
sum: number;
|
|
368
368
|
} : never;
|
|
@@ -461,36 +461,16 @@ export interface Repository<entityType> {
|
|
|
461
461
|
|
|
462
462
|
*/
|
|
463
463
|
aggregate<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options: Omit<GroupByOptions<entityType, never, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>, 'orderBy' | 'limit' | 'page' | 'group'>): Promise<GroupByResult<entityType, never, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>>;
|
|
464
|
-
/**
|
|
464
|
+
/**
|
|
465
|
+
* Fetches data from the repository in a way that is optimized for handling large sets of entity objects.
|
|
465
466
|
*
|
|
466
|
-
*
|
|
467
|
+
* Unlike the `find` method, which returns an array, the `query` method returns an iterable `QueryResult` object.
|
|
468
|
+
* This allows for more efficient data handling, particularly in scenarios that involve paging through large amounts of data.
|
|
467
469
|
*
|
|
468
|
-
* The
|
|
469
|
-
*
|
|
470
|
-
* @example
|
|
471
|
-
* for await (const task of taskRepo.query()) {
|
|
472
|
-
* // do something.
|
|
473
|
-
* }
|
|
474
|
-
* @example
|
|
475
|
-
* const query = taskRepo.query({
|
|
476
|
-
* where: { completed: false },
|
|
477
|
-
* pageSize: 100,
|
|
478
|
-
* })
|
|
479
|
-
* const count = await query.count()
|
|
480
|
-
* console.log('Paged: ' + count / 100)
|
|
481
|
-
* let paginator = await query.paginator()
|
|
482
|
-
* console.log(paginator.items.length)
|
|
483
|
-
* if (paginator.hasNextPage) {
|
|
484
|
-
* paginator = await paginator.nextPage()
|
|
485
|
-
* console.log(paginator.items.length)
|
|
486
|
-
* }
|
|
487
|
-
* */
|
|
488
|
-
query(options?: QueryOptions<entityType>): QueryResult<entityType>;
|
|
489
|
-
/**
|
|
490
|
-
* Fetches data from the repository, allowing for both standard querying and aggregation in a single request.
|
|
470
|
+
* The method supports pagination and aggregation in a single request. When aggregation options are provided,
|
|
471
|
+
* the result will include both the items from the current page and the results of the requested aggregation.
|
|
491
472
|
*
|
|
492
|
-
*
|
|
493
|
-
* the queried items for the current page and the results of the aggregation.
|
|
473
|
+
* The `query` method is designed for asynchronous iteration using the `for await` statement.
|
|
494
474
|
*
|
|
495
475
|
* @template entityType The type of the entity being queried.
|
|
496
476
|
* @template sumFields The fields to sum, provided as an array of numeric keys from the entity type.
|
|
@@ -503,7 +483,29 @@ export interface Repository<entityType> {
|
|
|
503
483
|
* @returns {QueryResultWithAggregates<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>} The result of the query, including paginated items and aggregation results.
|
|
504
484
|
*
|
|
505
485
|
* @example
|
|
506
|
-
* //
|
|
486
|
+
* // Basic usage with asynchronous iteration:
|
|
487
|
+
* for await (const task of taskRepo.query()) {
|
|
488
|
+
* // Perform some operation on each task
|
|
489
|
+
* }
|
|
490
|
+
*
|
|
491
|
+
* @example
|
|
492
|
+
* // Querying with pagination:
|
|
493
|
+
* const query = taskRepo.query({
|
|
494
|
+
* where: { completed: false },
|
|
495
|
+
* pageSize: 100,
|
|
496
|
+
* });
|
|
497
|
+
*
|
|
498
|
+
* let paginator = await query.paginator();
|
|
499
|
+
* console.log('Number of items on the current page:', paginator.items.length);
|
|
500
|
+
* console.log('Total pages:', Math.ceil(paginator.aggregate.$count / 100));
|
|
501
|
+
*
|
|
502
|
+
* if (paginator.hasNextPage) {
|
|
503
|
+
* paginator = await paginator.nextPage();
|
|
504
|
+
* console.log('Items on the next page:', paginator.items.length);
|
|
505
|
+
* }
|
|
506
|
+
*
|
|
507
|
+
* @example
|
|
508
|
+
* // Querying with aggregation:
|
|
507
509
|
* const result = await repo.query({
|
|
508
510
|
* where: { completed: false },
|
|
509
511
|
* pageSize: 50,
|
|
@@ -511,16 +513,16 @@ export interface Repository<entityType> {
|
|
|
511
513
|
* sum: ['salary'],
|
|
512
514
|
* average: ['age'],
|
|
513
515
|
* }
|
|
514
|
-
* });
|
|
516
|
+
* }).paginator();
|
|
515
517
|
*
|
|
516
|
-
* // Accessing
|
|
518
|
+
* // Accessing paginated items
|
|
517
519
|
* console.table(result.items);
|
|
518
520
|
*
|
|
519
|
-
* // Accessing
|
|
520
|
-
* console.log(result.aggregates.salary.sum); //
|
|
521
|
-
* console.log(result.aggregates.age.average);
|
|
521
|
+
* // Accessing aggregation results
|
|
522
|
+
* console.log('Total salary:', result.aggregates.salary.sum); // Sum of all salaries
|
|
523
|
+
* console.log('Average age:', result.aggregates.age.average); // Average age
|
|
522
524
|
*/
|
|
523
|
-
query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?:
|
|
525
|
+
query<sumFields extends NumericKeys<entityType>[] | undefined = undefined, averageFields extends NumericKeys<entityType>[] | undefined = undefined, minFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, maxFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined, distinctCountFields extends (keyof MembersOnly<entityType>)[] | undefined = undefined>(options?: QueryOptions<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>): QueryResult<entityType, sumFields extends undefined ? never : sumFields, averageFields extends undefined ? never : averageFields, minFields extends undefined ? never : minFields, maxFields extends undefined ? never : maxFields, distinctCountFields extends undefined ? never : distinctCountFields>;
|
|
524
526
|
/** Returns a count of the items matching the criteria.
|
|
525
527
|
* @see [EntityFilter](http://remult.dev/docs/entityFilter.html)
|
|
526
528
|
* @example
|
|
@@ -1013,20 +1015,18 @@ export interface FindFirstOptionsBase<entityType> extends LoadOptions<entityType
|
|
|
1013
1015
|
/** If set to true and an item is not found, it's created and returned*/
|
|
1014
1016
|
createIfNotFound?: boolean;
|
|
1015
1017
|
}
|
|
1016
|
-
export interface QueryOptions<entityType> extends FindOptionsBase<entityType> {
|
|
1018
|
+
export interface QueryOptions<entityType, sumFields extends NumericKeys<entityType>[] = never, averageFields extends NumericKeys<entityType>[] = never, minFields extends (keyof MembersOnly<entityType>)[] = never, maxFields extends (keyof MembersOnly<entityType>)[] = never, distinctCountFields extends (keyof MembersOnly<entityType>)[] = never> extends FindOptionsBase<entityType> {
|
|
1017
1019
|
/** The number of items to return in each step */
|
|
1018
1020
|
pageSize?: number;
|
|
1019
1021
|
/** A callback method to indicate the progress of the iteration */
|
|
1020
1022
|
progress?: {
|
|
1021
1023
|
progress: (progress: number) => void;
|
|
1022
1024
|
};
|
|
1023
|
-
|
|
1024
|
-
export interface QueryOptionsWithAggregates<entityType, sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends (keyof MembersOnly<entityType>)[], maxFields extends (keyof MembersOnly<entityType>)[], distinctCountFields extends (keyof MembersOnly<entityType>)[]> extends QueryOptions<entityType> {
|
|
1025
|
-
aggregate: Omit<GroupByOptions<entityType, never, sumFields, averageFields, minFields, maxFields, distinctCountFields>, 'group' | 'orderBy' | 'where' | 'limit' | 'page'>;
|
|
1025
|
+
aggregate?: Omit<GroupByOptions<entityType, never, sumFields, averageFields, minFields, maxFields, distinctCountFields>, 'group' | 'orderBy' | 'where' | 'limit' | 'page'>;
|
|
1026
1026
|
}
|
|
1027
1027
|
/** The result of a call to the `query` method in the `Repository` object.
|
|
1028
1028
|
*/
|
|
1029
|
-
export interface QueryResult<entityType> {
|
|
1029
|
+
export interface QueryResult<entityType, sumFields extends NumericKeys<entityType>[] = never, averageFields extends NumericKeys<entityType>[] = never, minFields extends (keyof MembersOnly<entityType>)[] = never, maxFields extends (keyof MembersOnly<entityType>)[] = never, distinctCountFields extends (keyof MembersOnly<entityType>)[] = never> {
|
|
1030
1030
|
/** returns an iterator that iterates the rows in the result using a paging mechanism
|
|
1031
1031
|
* @example
|
|
1032
1032
|
* for await (const task of taskRepo.query()) {
|
|
@@ -1038,16 +1038,12 @@ export interface QueryResult<entityType> {
|
|
|
1038
1038
|
};
|
|
1039
1039
|
/** returns the number of rows that match the query criteria */
|
|
1040
1040
|
count(): Promise<number>;
|
|
1041
|
-
/** Returns a `Paginator` object that is used for efficient paging */
|
|
1042
|
-
paginator(): Promise<Paginator<entityType>>;
|
|
1043
1041
|
/** gets the items in a specific page */
|
|
1044
1042
|
getPage(pageNumber?: number): Promise<entityType[]>;
|
|
1045
1043
|
/** Performs an operation on all the items matching the query criteria */
|
|
1046
1044
|
forEach(what: (item: entityType) => Promise<any>): Promise<number>;
|
|
1047
|
-
}
|
|
1048
|
-
export interface QueryResultWithAggregates<entityType, sumFields extends NumericKeys<entityType>[], averageFields extends NumericKeys<entityType>[], minFields extends (keyof MembersOnly<entityType>)[], maxFields extends (keyof MembersOnly<entityType>)[], distinctCountFields extends (keyof MembersOnly<entityType>)[]> extends QueryResult<entityType> {
|
|
1049
1045
|
/** Returns a `Paginator` object that is used for efficient paging */
|
|
1050
|
-
paginator(): Promise<
|
|
1046
|
+
paginator(): Promise<Paginator<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
|
|
1051
1047
|
}
|
|
1052
1048
|
/** An interface used to paginating using the `query` method in the `Repository` object
|
|
1053
1049
|
* @example
|
|
@@ -1065,18 +1061,15 @@ export interface QueryResultWithAggregates<entityType, sumFields extends Numeric
|
|
|
1065
1061
|
* console.log(paginator.items.length)
|
|
1066
1062
|
* }
|
|
1067
1063
|
*/
|
|
1068
|
-
export interface Paginator<entityType> {
|
|
1064
|
+
export interface Paginator<entityType, sumFields extends NumericKeys<entityType>[] = never, averageFields extends NumericKeys<entityType>[] = never, minFields extends (keyof MembersOnly<entityType>)[] = never, maxFields extends (keyof MembersOnly<entityType>)[] = never, distinctCountFields extends (keyof MembersOnly<entityType>)[] = never> {
|
|
1069
1065
|
/** the items in the current page */
|
|
1070
1066
|
items: entityType[];
|
|
1071
1067
|
/** True if next page exists */
|
|
1072
1068
|
hasNextPage: boolean;
|
|
1073
|
-
/** Gets the next page in the `query`'s result set */
|
|
1074
|
-
nextPage(): Promise<Paginator<entityType>>;
|
|
1075
1069
|
/** the count of the total items in the `query`'s result */
|
|
1076
1070
|
count(): Promise<number>;
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
nextPage(): Promise<PaginatorWithAggregates<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
|
|
1071
|
+
/** Gets the next page in the `query`'s result set */
|
|
1072
|
+
nextPage(): Promise<Paginator<entityType, sumFields, averageFields, minFields, maxFields, distinctCountFields>>;
|
|
1080
1073
|
aggregates: GroupByResult<entityType, never, sumFields, averageFields, minFields, maxFields, distinctCountFields>;
|
|
1081
1074
|
}
|
|
1082
1075
|
/**
|