/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You 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 org.apache.geode.cache.query.internal.cq; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.geode.cache.CacheEvent; import org.apache.geode.cache.client.Pool; import org.apache.geode.cache.client.internal.InternalPool; import org.apache.geode.cache.client.internal.QueueManager; import org.apache.geode.cache.client.internal.UserAttributes; import org.apache.geode.cache.query.CqAttributes; import org.apache.geode.cache.query.CqClosedException; import org.apache.geode.cache.query.CqException; import org.apache.geode.cache.query.CqExistsException; import org.apache.geode.cache.query.CqQuery; import org.apache.geode.cache.query.CqServiceStatistics; import org.apache.geode.cache.query.QueryInvalidException; import org.apache.geode.cache.query.RegionNotFoundException; import org.apache.geode.distributed.internal.DistributionAdvisor.Profile; import org.apache.geode.internal.cache.EventID; import org.apache.geode.internal.cache.FilterRoutingInfo; import org.apache.geode.internal.cache.tier.sockets.CacheClientNotifier; import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID; public interface CqService { /** * Constructs a new named continuous query, represented by an instance of CqQuery. The CqQuery is * not executed, however, until the execute method is invoked on the CqQuery. The name of the * query will be used to identify this query in statistics archival. * * @param cqName the String name for this query * @param queryString the OQL query * @param cqAttributes the CqAttributes * @param isDurable true if the CQ is durable * @return the newly created CqQuery object * @throws CqExistsException if a CQ by this name already exists on this client * @throws IllegalArgumentException if queryString or cqAttr is null * @throws IllegalStateException if this method is called from a cache server * @throws QueryInvalidException if there is a syntax error in the query * @throws CqException if failed to create cq, failure during creating managing cq metadata info. * E.g.: Query string should refer only one region, join not supported. The query must be * a SELECT statement. DISTINCT queries are not supported. Projections are not supported. * Only one iterator in the FROM clause is supported, and it must be a region path. Bind * parameters in the query are not supported for the initial release. * */ public abstract ClientCQ newCq(String cqName, String queryString, CqAttributes cqAttributes, InternalPool pool, boolean isDurable) throws QueryInvalidException, CqExistsException, CqException; /** * Retrieve a cq by client cq name from server * * @return the CqQuery or null if not found */ public abstract CqQuery getClientCqFromServer(ClientProxyMembershipID clientProxyId, String clientCqName); /** * Retrieve a CqQuery by name. * * @return the CqQuery or null if not found */ public abstract InternalCqQuery getCq(String cqName); /** * Retrieve all registered CQs */ public abstract Collection<? extends InternalCqQuery> getAllCqs(); /** * Retruns all the cqs on a given region. * */ public abstract Collection<? extends InternalCqQuery> getAllCqs(String regionName) throws CqException; /** * Executes all the cqs on this client. */ public abstract void executeAllClientCqs() throws CqException; /** * Executes all the cqs on a given region. */ public abstract void executeAllRegionCqs(String regionName) throws CqException; /** * Executes all the given cqs. */ public abstract void executeCqs(Collection<? extends InternalCqQuery> cqs) throws CqException; /** * Stops all the cqs on a given region. */ public abstract void stopAllClientCqs() throws CqException; /** * Stops all the cqs on a given region. */ public abstract void stopAllRegionCqs(String regionName) throws CqException; /** * Stops all the specified cqs. */ public abstract void stopCqs(Collection<? extends InternalCqQuery> cqs) throws CqException; /** * Closes all the cqs on a given region. */ public abstract void closeCqs(String regionName) throws CqException; /** * Called directly on server side. * * @param cqName * @param clientProxyId * @throws CqException */ public abstract void closeCq(String cqName, ClientProxyMembershipID clientProxyId) throws CqException; public abstract void closeAllCqs(boolean clientInitiated); public abstract void closeAllCqs(boolean clientInitiated, Collection<? extends InternalCqQuery> cqs, boolean keepAlive); /** * Get statistics information for all CQs * * @return the CqServiceStatistics */ public abstract CqServiceStatistics getCqStatistics(); /** * Server side method. * * @param clientProxyId * @throws CqException */ public abstract void closeClientCqs(ClientProxyMembershipID clientProxyId) throws CqException; /** * Returns all the CQs registered by the client. * * @param clientProxyId * @return CQs registered by the client. */ public abstract List<ServerCQ> getAllClientCqs(ClientProxyMembershipID clientProxyId); /** * Returns all the durable client CQs registered by the client. * * @param clientProxyId * @return CQs registered by the client. */ public abstract List<String> getAllDurableClientCqs(ClientProxyMembershipID clientProxyId) throws CqException; /** * Invokes the CqListeners for the given CQs. * * @param cqs list of cqs with the cq operation from the Server. * @param messageType base operation * @param key * @param value */ public abstract void dispatchCqListeners(HashMap<String, Integer> cqs, int messageType, Object key, Object value, byte[] delta, QueueManager qManager, EventID eventId); public abstract void processEvents(CacheEvent event, Profile localProfile, Profile[] profiles, FilterRoutingInfo frInfo) throws CqException; public UserAttributes getUserAttributes(String cqName); /** * Closes the CqService. */ public void close(); /** * Returns true if the CQ service has not been closed yet. */ public boolean isRunning(); public void start(); /** * @return Returns the serverCqName. */ public String constructServerCqName(String cqName, ClientProxyMembershipID clientProxyId); /** * Called directly on server side. * * @param cqName * @param clientId * @throws CqException */ public void stopCq(String cqName, ClientProxyMembershipID clientId) throws CqException; /** * Called directly on the server side. * * @param cqState new state * @param cQuery */ public void resumeCQ(int cqState, ServerCQ cQuery); public void cqsDisconnected(Pool pool); public void cqsConnected(Pool pool); /** * Executes the given CqQuery, if the CqQuery for that name is not there it registers the one and * executes. This is called on the Server. * * @param cqName * @param queryString * @param cqState * @param clientProxyId * @param ccn * @param manageEmptyRegions whether to update the 6.1 emptyRegions map held in the CCN * @param regionDataPolicy the data policy of the region associated with the query. This is only * needed if manageEmptyRegions is true. * @param emptyRegionsMap map of empty regions. * @throws IllegalStateException if this is called at client side. * @throws CqException */ public ServerCQ executeCq(String cqName, String queryString, int cqState, ClientProxyMembershipID clientProxyId, CacheClientNotifier ccn, boolean isDurable, boolean manageEmptyRegions, int regionDataPolicy, Map emptyRegionsMap) throws CqException, RegionNotFoundException, CqClosedException; /** * Server side method. Closes non-durable CQs for the given client proxy id. * * @param clientProxyId * @throws CqException */ public void closeNonDurableClientCqs(ClientProxyMembershipID clientProxyId) throws CqException; public abstract List<String> getAllDurableCqsFromServer(InternalPool pool); }