Due to an issue I posted about in a previous thread
http://apache-ignite-users.70518.x6.nabble.com/Basic-SQL-pagination-returning-incorrect-results-td35443.html

I've written a work around to use the streamer interface with a ScanQuery
to duplicate a cache.
Both are created from SQL using something like this:

repo.query("create table page1(a varchar, b varchar, c varchar,
PRIMARY KEY (a, b)) WITH \"cache_name=page1\"")
repo.query("create table page2(a varchar, b varchar, c varchar,
PRIMARY KEY (a, b)) WITH \"cache_name=page2\"")

The data is copied, printing the size shows 100 as expected in the test but
a SQL query on page2 table returns 0 rows.

def copied = repo.query("SELECT * FROM page2 LIMIT 101")

Gets nothing. The copy function used is below. I'm presuming I've missed a
step and the SQL index or something else is not being done. How should this
be written to duplicate all data from page1 into page2 table/cache.

public void copy(String fromTableName, String toTableName) {
  var ignite = ctx.ignite;
  try (
    IgniteCache<Object, Object> from = ignite.cache(fromTableName);
    IgniteCache<Object, Object> to = ignite.cache(toTableName)
  ) {
    if (from == null || to == null) {
      throw new IllegalArgumentException(format("Both from and to
tables must exist. from: %s, to: %s", fromTableName, toTableName));
    }
    try (
      IgniteDataStreamer<Object, Object> strmr =
ignite.dataStreamer(toTableName/*from.getName()*/);
      var cursor = from.withKeepBinary().query(new ScanQuery<>())
    ) {
      strmr.allowOverwrite(true);
      strmr.keepBinary(true);
      //strmr.receiver(StreamVisitor.from((cache, e) ->
to.put(e.getKey(), e.getValue())));
      for (Cache.Entry<Object, Object> e : cursor) {
        strmr.addData(e.getKey(), e.getValue());
      }
      //strmr.flush();
    }
    log.info("Total in target cache {}", to.sizeLong(CachePeekMode.ALL));
  }
}



Regards,
Courtney Robinson
Founder and CEO, Hypi
Tel: ++44 208 123 2413 (GMT+0) <https://hypi.io>

<https://hypi.io>
https://hypi.io

Reply via email to