/*
* Copyright 2023, TeamDev. All rights reserved.
*
* 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
*
* Redistribution and use in source and/or binary forms, with or without
* modification, must retain the above copyright notice and the following
* disclaimer.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import {QueryRequest} from "./query-request";
/**
* A client which performs entity state queries.
*
* @abstract
*/
export class QueryingClient {
/**
* @param {!ActorRequestFactory} actorRequestFactory
* a request factory to build requests to Spine server
*/
constructor(actorRequestFactory) {
this._requestFactory = actorRequestFactory;
}
/**
* Creates a new query request.
*
* @param {!Class<Message>} entityType the target entity type
* @param {!Client} client the client which initiated the request
* @return {QueryRequest} a new query request
*/
select(entityType, client) {
return new QueryRequest(entityType, client, this._requestFactory);
}
/**
* Executes the given `Query` instance specifying the data to be retrieved from
* Spine server fulfilling a returned promise with an array of received objects.
*
* @param {!spine.client.Query} query a query instance to be executed
* @return {Promise<Message[]>} a promise to be fulfilled with a list of Protobuf
* messages of a given type or with an empty list if no entities matching given query
* were found; rejected with a `SpineError` if error occurs
*
* @template <T> a Protobuf type of entities being the target of a query
*/
read(query) {
throw new Error('Not implemented in abstract base.');
}
/**
* Creates a new query factory instance which can be further used for the `Query` creation.
*
* @return {QueryFactory}
*/
newQuery() {
return this._requestFactory.query();
}
}