Skip to content

Commit

Permalink
resolve dynamic filed parse and add more test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
baichuan3 committed Feb 17, 2025
1 parent 3c6c327 commit d52c7d5
Show file tree
Hide file tree
Showing 11 changed files with 422 additions and 117 deletions.
4 changes: 3 additions & 1 deletion crates/rooch-indexer/src/indexer_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,9 @@ impl IndexerReader {
} else {
format!("{OBJECT_ID_STR} ASC, {FIELD_VALUE_STR} ASC")
};
let page_clause = format!("{}, {}", page_of - 1, limit);
let mut start_limit = (page_of - 1) * (limit as u64);
start_limit = start_limit.saturating_sub(1);
let page_clause = format!("{}, {}", start_limit, limit);
let query = format!(
"
SELECT * FROM fields \
Expand Down
25 changes: 8 additions & 17 deletions crates/rooch-indexer/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,11 @@ use diesel::ConnectionError::BadConnection;
use diesel::RunQueryDsl;
use errors::IndexerError;
use moveos_store::MoveOSStore;
use moveos_types::move_types::type_tag_match;
use moveos_types::moveos_std::object::{
is_dynamic_field_type, parse_dynamic_field_type_tags, ObjectID, RawField,
};
use moveos_types::state::MoveType;
use moveos_types::moveos_std::object::{is_dynamic_field_type, DynamicField, ObjectID};
use moveos_types::state_resolver::{RootObjectResolver, StateResolver};
use once_cell::sync::Lazy;
use prometheus::Registry;
use rooch_types::framework::indexer::IndexerModule;
use rooch_types::framework::indexer::{FieldIndexerData, IndexerModule};
use rooch_types::indexer::event::IndexerEvent;
use rooch_types::indexer::field::{IndexerField, IndexerFieldChanges};
use rooch_types::indexer::state::{
Expand Down Expand Up @@ -439,27 +435,22 @@ pub fn get_sqlite_pool_connection(
pub fn list_field_indexer_keys(
resolver: &RootObjectResolver<MoveOSStore>,
) -> Result<Vec<ObjectID>> {
// let resolver = RootObjectResolver::new(self.root.clone(), &self.moveos_store);
let field_indexer_object_id = IndexerModule::field_indexer_object_id();
let states = resolver.list_fields(&field_indexer_object_id, None, MAX_LIST_FIELD_SIZE)?;

let data = states
.into_iter()
.filter_map(|state| {
let object_type = state.1.metadata.object_type;
let object_type = state.1.metadata.object_type.clone();
if !is_dynamic_field_type(&object_type) {
return None;
}

parse_dynamic_field_type_tags(&object_type).and_then(|(name_type, value_type)| {
if !type_tag_match(&ObjectID::type_tag(), &name_type) {
return None;
}

RawField::parse_unchecked_field(state.1.value.as_slice(), name_type, value_type)
.ok()
.and_then(|raw_field| bcs::from_bytes::<ObjectID>(&raw_field.name).ok())
})
state
.1
.value_as_uncheck::<DynamicField<ObjectID, FieldIndexerData>>()
.ok()
.map(|df| df.name)
})
.collect();

Expand Down
10 changes: 7 additions & 3 deletions crates/rooch-rpc-server/src/server/rooch_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -815,9 +815,13 @@ impl RoochAPIServer for RoochServer {
let has_next_page = fields.len() > limit_of;
fields.truncate(limit_of);

let next_page_check = page_of.checked_add(1).ok_or(RpcError::UnexpectedError(
"next page value is overflow".to_string(),
))?;
let next_page_check = if has_next_page {
page_of.checked_add(1).ok_or(RpcError::UnexpectedError(
"next page value is overflow".to_string(),
))?
} else {
page_of
};
let next_cursor = Some(StrView(next_page_check));

Ok(FieldPageView {
Expand Down
Loading

0 comments on commit d52c7d5

Please sign in to comment.