/// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception> internal IEnumerable<QueryRow> QueryViewNamed(String viewName, QueryOptions options, IList<Int64> outLastSequence) { var before = Runtime.CurrentTimeMillis(); var lastSequence = 0L; IEnumerable<QueryRow> rows; if (!String.IsNullOrEmpty (viewName)) { var view = GetView (viewName); if (view == null) { throw new CouchbaseLiteException (StatusCode.NotFound); } lastSequence = view.LastSequenceIndexed; if (options.GetStale () == IndexUpdateMode.Before || lastSequence <= 0) { view.UpdateIndex (); lastSequence = view.LastSequenceIndexed; } else { if (options.GetStale () == IndexUpdateMode.After && lastSequence < GetLastSequenceNumber()) // NOTE: The exception is handled inside the thread. // TODO: Consider using the async keyword instead. try { view.UpdateIndex(); } catch (CouchbaseLiteException e) { Log.E(Tag, "Error updating view index on background thread", e); } } rows = view.QueryWithOptions (options); } else { // nil view means query _all_docs // note: this is a little kludgy, but we have to pull out the "rows" field from the // result dictionary because that's what we want. should be refactored, but // it's a little tricky, so postponing. var allDocsResult = GetAllDocs (options); rows = (IList<QueryRow>)allDocsResult.Get ("rows"); lastSequence = GetLastSequenceNumber (); } outLastSequence.AddItem(lastSequence); var delta = Runtime.CurrentTimeMillis() - before; Log.D(Tag, String.Format("Query view {0} completed in {1} milliseconds", viewName, delta)); return rows; }
public IList<QueryRow> QueryViewNamed(string viewName, QueryOptions options, IList <long> outLastSequence) { long before = Runtime.CurrentTimeMillis(); long lastSequence = 0; IList<QueryRow> rows = null; if (viewName != null && viewName.Length > 0) { View view = GetView(viewName); if (view == null) { throw new CouchbaseLiteException(new Status(Status.NotFound)); } lastSequence = view.GetLastSequenceIndexed(); if (options.GetStale() == Query.IndexUpdateMode.Before || lastSequence <= 0) { view.UpdateIndex(); lastSequence = view.GetLastSequenceIndexed(); } else { if (options.GetStale() == Query.IndexUpdateMode.After && lastSequence < GetLastSequenceNumber ()) { new Sharpen.Thread(new _Runnable_1847(view)).Start(); } } rows = view.QueryWithOptions(options); } else { // nil view means query _all_docs // note: this is a little kludgy, but we have to pull out the "rows" field from the // result dictionary because that's what we want. should be refactored, but // it's a little tricky, so postponing. IDictionary<string, object> allDocsResult = GetAllDocs(options); rows = (IList<QueryRow>)allDocsResult.Get("rows"); lastSequence = GetLastSequenceNumber(); } outLastSequence.AddItem(lastSequence); long delta = Runtime.CurrentTimeMillis() - before; Log.D(Database.Tag, string.Format("Query view %s completed in %d milliseconds", viewName , delta)); return rows; }