Query Results::get_query() const { validate_read(); switch (m_mode) { case Mode::Empty: case Mode::Query: return m_query; case Mode::TableView: { // A TableView has an associated Query if it was produced by Query::find_all. This is indicated // by TableView::get_query returning a Query with a non-null table. Query query = m_table_view.get_query(); if (query.get_table()) { return query; } // The TableView has no associated query so create one with no conditions that is restricted // to the rows in the TableView. m_table_view.sync_if_needed(); return Query(*m_table, std::make_unique<TableView>(m_table_view)); } case Mode::LinkView: return m_table->where(m_link_view); case Mode::Table: return m_table->where(); } REALM_UNREACHABLE(); }
ResultsNotifier::ResultsNotifier(Results& target) : CollectionNotifier(target.get_realm()) , m_target_results(&target) , m_target_is_in_table_order(target.is_in_table_order()) { Query q = target.get_query(); set_table(*q.get_table()); m_query_handover = Realm::Internal::get_shared_group(*get_realm()).export_for_handover(q, MutableSourcePayload::Move); SortDescriptor::generate_patch(target.get_sort(), m_sort_handover); }
JNIEXPORT jlong JNICALL Java_io_realm_internal_TableQuery_nativeRemove( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong start, jlong end, jlong limit) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery) || !ROW_INDEXES_VALID(env, pTable, start, end, limit)) return 0; try { return pQuery->remove(S(start), S(end), S(limit)); } CATCH_STD() return 0; }
JNIEXPORT jlong JNICALL Java_io_realm_internal_TableQuery_nativeFindAll( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong start, jlong end, jlong limit) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery) || !ROW_INDEXES_VALID(env, pTable, start, end, limit)) return -1; try { TableView* pResultView = new TableView( pQuery->find_all(S(start), S(end), S(limit)) ); return reinterpret_cast<jlong>(pResultView); } CATCH_STD() return -1; }
JNIEXPORT jdouble JNICALL Java_io_realm_internal_TableQuery_nativeMinimumDouble( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong columnIndex, jlong start, jlong end, jlong limit) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery) || !COL_INDEX_AND_TYPE_VALID(env, pTable, columnIndex, type_Double) || !ROW_INDEXES_VALID(env, pTable, start, end, limit)) return 0; try { return pQuery->minimum_double(S(columnIndex), NULL, S(start), S(end), S(limit)); } CATCH_STD() return 0; }
JNIEXPORT jlong JNICALL Java_io_realm_internal_TableQuery_nativeMinimumDate( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong columnIndex, jlong start, jlong end, jlong limit) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery) || !COL_INDEX_AND_TYPE_VALID(env, pTable, columnIndex, type_DateTime) || !ROW_INDEXES_VALID(env, pTable, start, end, limit)) return 0; try { // This exploits the fact that dates are stored as int in core return pQuery->minimum_int(S(columnIndex), NULL, S(start), S(end), S(limit)); } CATCH_STD() return 0; }
JNIEXPORT jdouble JNICALL Java_io_realm_internal_TableQuery_nativeAverageFloat( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong columnIndex, jlong start, jlong end, jlong limit) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery) || !COL_INDEX_AND_TYPE_VALID(env, pTable, columnIndex, type_Float) || !ROW_INDEXES_VALID(env, pTable, start, end, limit)) return 0; try { size_t resultcount; double avg = pQuery->average_float(S(columnIndex), &resultcount, S(start), S(end), S(limit)); return avg; } CATCH_STD() return 0; }
JNIEXPORT jdouble JNICALL Java_io_realm_internal_TableQuery_nativeAverageInt( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong columnIndex, jlong start, jlong end, jlong limit) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery) || !COL_INDEX_AND_TYPE_VALID(env, pTable, columnIndex, type_Int) || !ROW_INDEXES_VALID(env, pTable, start, end, limit)) return 0; try { size_t resultcount; //TODO: return resultcount? double avg = pQuery->average_int(S(columnIndex), &resultcount, S(start), S(end), S(limit)); //fprintf(stderr, "!!!Average(%d, %d) = %f (%d results)\n", start, end, avg, resultcount); fflush(stderr); return avg; } CATCH_STD() return 0; }
JNIEXPORT jlong JNICALL Java_io_realm_internal_TableQuery_nativeFind( JNIEnv* env, jobject, jlong nativeQueryPtr, jlong fromTableRow) { Query* pQuery = Q(nativeQueryPtr); Table* pTable = Ref2Ptr(pQuery->get_table()); if (!QUERY_VALID(env, pQuery)) return -1; // It's valid to go 1 past the end index if ((fromTableRow < 0) || (S(fromTableRow) > pTable->size())) { // below check will fail with appropriate exception (void) ROW_INDEX_VALID(env, pTable, fromTableRow); return -1; } try { size_t r = pQuery->find( S(fromTableRow) ); return (r == not_found) ? jlong(-1) : jlong(r); } CATCH_STD() return -1; }