All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cognite.client.Events Maven / Gradle / Ivy

There is a newer version: 2.3.3
Show newest version
/*
 * Copyright (c) 2020 Cognite AS
 *
 * 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.
 */

package com.cognite.client;

import com.cognite.client.dto.Aggregate;
import com.cognite.client.dto.Event;
import com.cognite.client.dto.Item;
import com.cognite.client.config.ResourceType;
import com.cognite.client.servicesV1.ConnectorServiceV1;
import com.cognite.client.servicesV1.parser.EventParser;
import com.cognite.client.config.UpsertMode;
import com.cognite.client.stream.ListSource;
import com.cognite.client.stream.Publisher;
import com.cognite.client.util.Items;
import com.google.auto.value.AutoValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import java.util.stream.Collectors;

/**
 * This class represents the Cognite events api endpoint.
 * 

* It provides methods for reading and writing {@link Event}. */ @AutoValue public abstract class Events extends ApiBase implements ListSource { private static Builder builder() { return new AutoValue_Events.Builder(); } protected static final Logger LOG = LoggerFactory.getLogger(Events.class); /** * Constructs a new {@link Events} object using the provided client configuration. *

* This method is intended for internal use--SDK clients should always use {@link CogniteClient} * as the entry point to this class. * * @param client The {@link CogniteClient} to use for configuration settings. * @return the assets api object. */ public static Events of(CogniteClient client) { return Events.builder() .setClient(client) .build(); } /** * Returns all {@link Event} objects. * * @see #list(Request) */ public Iterator> list() throws Exception { return this.list(Request.create()); } /** * Returns all {@link Event} objects that matches the filters set in the {@link Request}. *

* The results are paged through / iterated over via an {@link Iterator}--the entire results set is not buffered in * memory, but streamed in "pages" from the Cognite api. If you need to buffer the entire results set, then you * have to stream these results into your own data structure. *

* The events are retrieved using multiple, parallel request streams towards the Cognite api. The number of * parallel streams are set in the {@link com.cognite.client.config.ClientConfig}. * * @param requestParameters the filters to use for retrieving the assets. * @return an {@link Iterator} to page through the results set. * @throws Exception */ public Iterator> list(Request requestParameters) throws Exception { List partitions = buildPartitionsList(getClient().getClientConfig().getNoListPartitions()); return this.list(requestParameters, partitions.toArray(new String[partitions.size()])); } /** * Returns all {@link Event} objects that matches the filters set in the {@link Request} for the * specified partitions. This is method is intended for advanced use cases where you need direct control over * the individual partitions. For example, when using the SDK in a distributed computing environment. *

* The results are paged through / iterated over via an {@link Iterator}--the entire results set is not buffered in * memory, but streamed in "pages" from the Cognite api. If you need to buffer the entire results set, then you * have to stream these results into your own data structure. * * @param requestParameters the filters to use for retrieving the assets. * @param partitions the partitions to include. * @return an {@link Iterator} to page through the results set. * @throws Exception */ public Iterator> list(Request requestParameters, String... partitions) throws Exception { return AdapterIterator.of(listJson(ResourceType.EVENT, requestParameters, partitions), this::parseEvent); } /** * Returns a {@link Publisher} that can stream {@link Event} from Cognite Data Fusion. * * When an {@link Event} is created or updated, it will be captured by the publisher and emitted to the registered * consumer. * * @return The publisher producing the stream of events. Call {@code start()} to start the stream. */ public Publisher stream() { return Publisher.of(this); } /** * Retrieve events by {@code externalId}. * * @param externalId The {@code externalIds} to retrieve * @return The retrieved events. * @throws Exception */ public List retrieve(String... externalId) throws Exception { return retrieve(Items.parseItems(externalId)); } /** * Retrieve events by {@code internal id}. * * @param id The {@code ids} to retrieve * @return The retrieved events. * @throws Exception */ public List retrieve(long... id) throws Exception { return retrieve(Items.parseItems(id)); } /** * Retrieve events by {@code externalId / id}. * * @param items The item(s) {@code externalId / id} to retrieve. * @return The retrieved events. * @throws Exception */ public List retrieve(List items) throws Exception { return retrieveJson(ResourceType.EVENT, items).stream() .map(this::parseEvent) .collect(Collectors.toList()); } /** * Performs an item aggregation request to Cognite Data Fusion. *

* The default aggregation is a total item count based on the (optional) filters in the request. * Multiple aggregation types are supported. Please refer to the Cognite API specification for more information * on the possible settings. * * @param requestParameters The filtering and aggregates specification * @return The aggregation results. * @throws Exception * @see Cognite API v1 specification */ public Aggregate aggregate(Request requestParameters) throws Exception { return aggregate(ResourceType.EVENT, requestParameters); } /** * Creates or updates a set of {@link Event} objects. *

* If it is a new {@link Event} object (based on {@code id / externalId}, then it will be created. *

* If an {@link Event} object already exists in Cognite Data Fusion, it will be updated. The update behavior * is specified via the update mode in the {@link com.cognite.client.config.ClientConfig} settings. * * @param events The events to upsert. * @return The upserted events. * @throws Exception */ public List upsert(List events) throws Exception { ConnectorServiceV1 connector = getClient().getConnectorService(); ConnectorServiceV1.ItemWriter createItemWriter = connector.writeEvents(); ConnectorServiceV1.ItemWriter updateItemWriter = connector.updateEvents(); UpsertItems upsertItems = UpsertItems.of(createItemWriter, this::toRequestInsertItem, getClient().buildAuthConfig()) .withUpdateItemWriter(updateItemWriter) .withUpdateMappingFunction(this::toRequestUpdateItem) .withIdFunction(this::getEventId); if (getClient().getClientConfig().getUpsertMode() == UpsertMode.REPLACE) { upsertItems = upsertItems.withUpdateMappingFunction(this::toRequestReplaceItem); } return upsertItems.upsertViaCreateAndUpdate(events).stream() .map(this::parseEvent) .collect(Collectors.toList()); } /** * Deletes a set of Events. *

* The events to delete are identified via their {@code externalId / id} by submitting a list of * {@link Item}. * * @param events a list of {@link Item} representing the events (externalId / id) to be deleted * @return The deleted events via {@link Item} * @throws Exception */ public List delete(List events) throws Exception { ConnectorServiceV1 connector = getClient().getConnectorService(); ConnectorServiceV1.ItemWriter deleteItemWriter = connector.deleteEvents(); DeleteItems deleteItems = DeleteItems.of(deleteItemWriter, getClient().buildAuthConfig()) .addParameter("ignoreUnknownIds", true); return deleteItems.deleteItems(events); } /* Wrapping the parser because we need to handle the exception--an ugly workaround since lambdas don't deal very well with exceptions. */ private Event parseEvent(String json) { try { return EventParser.parseEvent(json); } catch (Exception e) { throw new RuntimeException(e); } } /* Wrapping the parser because we need to handle the exception--an ugly workaround since lambdas don't deal very well with exceptions. */ private Map toRequestInsertItem(Event item) { try { return EventParser.toRequestInsertItem(item); } catch (Exception e) { throw new RuntimeException(e); } } /* Wrapping the parser because we need to handle the exception--an ugly workaround since lambdas don't deal very well with exceptions. */ private Map toRequestUpdateItem(Event item) { try { return EventParser.toRequestUpdateItem(item); } catch (Exception e) { throw new RuntimeException(e); } } /* Wrapping the parser because we need to handle the exception--an ugly workaround since lambdas don't deal very well with exceptions. */ private Map toRequestReplaceItem(Event item) { try { return EventParser.toRequestReplaceItem(item); } catch (Exception e) { throw new RuntimeException(e); } } /* Returns the id of an event. It will first check for an externalId, second it will check for id. If no id is found, it returns an empty Optional. */ private Optional getEventId(Event item) { if (item.hasExternalId()) { return Optional.of(item.getExternalId()); } else if (item.hasId()) { return Optional.of(String.valueOf(item.getId())); } else { return Optional.empty(); } } @AutoValue.Builder abstract static class Builder extends ApiBase.Builder { abstract Events build(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy