[
https://issues.apache.org/jira/browse/IGNITE-7849?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16388005#comment-16388005
]
Kevin Jin commented on IGNITE-7849:
-----------------------------------
Ideally, I would like to be able to specify SqlQuery for the remote filter so
that if I run an Ignite client node on .NET, I don't need to have a .NET Ignite
server node in my cluster in order to evaluate the .NET predicate for the
remote filter, but instead can just execute the SqlQuery on a Java server node.
> Generating a CacheEntryEventFilter from a SqlQuery
> --------------------------------------------------
>
> Key: IGNITE-7849
> URL: https://issues.apache.org/jira/browse/IGNITE-7849
> Project: Ignite
> Issue Type: Wish
> Components: cache, sql
> Affects Versions: 2.3
> Reporter: Kevin Jin
> Priority: Trivial
> Labels: features, usability
> Fix For: None
>
> Original Estimate: 0.2h
> Remaining Estimate: 0.2h
>
> Currently when we want to use the same predicate for the continuous query and
> initial query, it's easy enough to write something like this, assuming we are
> fine with the performance of ScanQuery:
> {code:title=IgniteContinuousQueryExample.java|borderStyle=solid}
> import org.apache.ignite.Ignite;
> import org.apache.ignite.IgniteCache;
> import org.apache.ignite.Ignition;
> import org.apache.ignite.cache.query.ContinuousQuery;
> import org.apache.ignite.cache.query.QueryCursor;
> import org.apache.ignite.cache.query.ScanQuery;
> import javax.cache.Cache;
> import javax.cache.event.CacheEntryEvent;
> public class IgniteContinuousQueryExample {
> private static final String CLUSTER = "TESTGRID";
> private static final String TABLE = "TESTTABLE";
> private static boolean isInteresting(Integer key, String value) {
> return key > 10;
> }
> private static boolean isInteresting(CacheEntryEvent<? extends Integer, ?
> extends String> event) {
> return isInteresting(event.getKey(), event.getValue());
> }
> private static void handleEntry(Cache.Entry<? extends Integer, ? extends
> String> event) {
> System.out.println("Received value for " + event.getKey() + ": " +
> event.getValue());
> }
> private static void handleExistingEntries(Iterable<? extends
> Cache.Entry<? extends Integer, ? extends String>> events) {
> events.forEach(IgniteContinuousQueryExample::handleEntry);
> }
> public static void main(String[] args) throws InterruptedException {
> try (Ignite client = Ignition.ignite(CLUSTER); IgniteCache<Integer,
> String> cache = client.cache(TABLE)) {
> for (int i = 0; i < 20; i++)
> cache.put(i, Integer.toString(i));
> ContinuousQuery<Integer, String> query = new ContinuousQuery<>();
> query.setRemoteFilterFactory(() ->
> IgniteContinuousQueryExample::isInteresting);
> query.setInitialQuery(new
> ScanQuery<>(IgniteContinuousQueryExample::isInteresting));
>
> query.setLocalListener(IgniteContinuousQueryExample::handleExistingEntries);
> try (QueryCursor<Cache.Entry<Integer, String>> resultSet =
> cache.query(query)) {
> handleExistingEntries(resultSet);
> // Local listener callbacks will no longer be received once
> resultSet is closed so
> // these updates have to be inside the try-with-resources
> block and we have to wait
> // to close resultSet after the final update.
> for (int i = 20; i < 30; i++)
> cache.put(i, Integer.toString(i));
> Thread.sleep(60000);
> }
> }
> }
> }
> {code}
> However, this becomes more inconvenient when we want to use SqlQuery in the
> initial query to take advantage of indexing. This is the best that I can do:
> {noformat}
> query.setRemoteFilterFactory(() -> entry -> entry.getKey() > 10);
> query.setInitialQuery(new SqlQuery<>(String.sql, "`_key` > 10"));
> {noformat}
> This is obviously not ideal because we have to specify the predicate in two
> different ways. A quick Google revealed that there are products out there
> that more seamlessly support this use case of continuous querying. I
> understand that Ignite isn't built on top of SQL, unlike the commercial
> RDBMSes I found, so maybe this is an out-of-scope feature.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)