get<TModel extends TRepositoryModel> method

  1. @override
Future<List<TModel>> get<TModel extends TRepositoryModel>({
  1. OfflineFirstGetPolicy policy = OfflineFirstGetPolicy.awaitRemoteWhenNoneExist,
  2. Query? query,
  3. bool seedOnly = false,
})
inherited

Load association from SQLite first; if the TModel hasn't been loaded previously, fetch it from remoteProvider and hydrate SQLite. For available query providerArgs see remoteProvider#get SqliteProvider.get.

seedOnly does not load data from SQLite after inserting records. Association queries can be expensive for large datasets, making deserialization a significant hit when the result is ignorable (e.g. eager loading). Defaults to false.

Implementation

@override
Future<List<TModel>> get<TModel extends TRepositoryModel>({
  OfflineFirstGetPolicy policy = OfflineFirstGetPolicy.awaitRemoteWhenNoneExist,
  Query? query,
  bool seedOnly = false,
}) async {
  final withPolicy = applyPolicyToQuery(query, get: policy);
  query = (withPolicy ?? const Query()).copyWith(action: QueryAction.get);
  logger.finest('#get: $TModel $query');

  final requireRemote = policy == OfflineFirstGetPolicy.awaitRemote;
  final hydrateUnexisting = policy == OfflineFirstGetPolicy.awaitRemoteWhenNoneExist;
  final alwaysHydrate = policy == OfflineFirstGetPolicy.alwaysHydrate;

  try {
    _latestGetPolicy = policy;

    if (memoryCacheProvider.canFind<TModel>(query) && !requireRemote) {
      final memoryCacheResults = memoryCacheProvider.get<TModel>(query: query, repository: this);

      if (alwaysHydrate) {
        // start round trip for fresh data
        // ignore: unawaited_futures
        hydrate<TModel>(query: query, deserializeSqlite: !seedOnly);
      }

      if (memoryCacheResults?.isNotEmpty ?? false) return memoryCacheResults!;
    }

    final modelExists = await exists<TModel>(query: query);

    if (requireRemote || (hydrateUnexisting && !modelExists)) {
      return await hydrate<TModel>(query: query, deserializeSqlite: !seedOnly);
    } else if (alwaysHydrate) {
      // start round trip for fresh data
      // ignore: unawaited_futures
      hydrate<TModel>(query: query, deserializeSqlite: !seedOnly);
    }

    return await sqliteProvider
        .get<TModel>(query: query, repository: this)
        // cache this query
        .then((m) => memoryCacheProvider.hydrate<TModel>(m));
  } finally {
    _latestGetPolicy = null;
  }
}