static int find_one(h5item *item, char *findname, hid_t *obj, int *item_type) { int status = 0; char *name = strcpy(malloc(strlen(item->name)+1),item->name); char *tmp; h5item *itm; for (itm = item->parent; itm; itm=itm->parent) { tmp = malloc(strlen(name)+strlen(itm->name)+2); strcpy(tmp,itm->name); strcat(tmp,"/"); strcat(tmp,name); free(name); name = tmp; } if (item->item_type == H5G_DATASET || item->item_type == -1) { if (strcmp(findname,name) == 0) { *obj = item->obj; *item_type = item->item_type; status = 1; } } free(name); if ((!status) && item->attribute) status = find_one(item->attribute,findname,obj,item_type); if ((!status) && item->child) status = find_one(item->child,findname,obj,item_type); if ((!status) && item->brother) status = find_one(item->brother,findname,obj,item_type); return status; }
static int FindItem(char *namein, hid_t *obj, int *item_type) { int status; int i; char *name = strcpy(malloc(strlen(namein)+1),namein); for (i=strlen(name)-1;i >= 0; i--) if (name[i] == 32) name[i]=0; else break; status = find_one(current,name,obj,item_type); free(name); return status; }
// Recursive search through the whole tree until name is found PropertyStream::Source* PropertyStream::Source::find_one_deep (std::string const& name) { Source* found = find_one (name); if (found != nullptr) return found; SharedState::Access state (this->m_state); for (auto iter : state->children) { found = iter.source().find_one_deep (name); if (found != nullptr) return found; } return nullptr; }
void test_find_one() { // Create a table and insert rows. auto db = grnxx::open_db(""); auto table = db->create_table("Table"); table->insert_row(); table->insert_row(); table->insert_row(); auto column = table->create_column("Int", GRNXX_INT); assert(column->find_one(grnxx::Int(123)).is_na()); assert(column->find_one(grnxx::Int(456)).is_na()); assert(column->find_one(grnxx::Int(789)).is_na()); assert(!column->find_one(grnxx::Int::na()).is_na()); column->set(grnxx::Int(0), grnxx::Int(123)); assert(!column->find_one(grnxx::Int(123)).is_na()); assert(column->find_one(grnxx::Int(456)).is_na()); assert(column->find_one(grnxx::Int(789)).is_na()); assert(!column->find_one(grnxx::Int::na()).is_na()); column->set(grnxx::Int(1), grnxx::Int(456)); assert(!column->find_one(grnxx::Int(123)).is_na()); assert(!column->find_one(grnxx::Int(456)).is_na()); assert(column->find_one(grnxx::Int(789)).is_na()); assert(!column->find_one(grnxx::Int::na()).is_na()); column->set(grnxx::Int(2), grnxx::Int(789)); assert(!column->find_one(grnxx::Int(123)).is_na()); assert(!column->find_one(grnxx::Int(456)).is_na()); assert(!column->find_one(grnxx::Int(789)).is_na()); assert(column->find_one(grnxx::Int::na()).is_na()); column->create_index("Index", GRNXX_TREE_INDEX); assert(!column->find_one(grnxx::Int(123)).is_na()); assert(!column->find_one(grnxx::Int(456)).is_na()); assert(!column->find_one(grnxx::Int(789)).is_na()); assert(column->find_one(grnxx::Int::na()).is_na()); column->set(grnxx::Int(2), grnxx::Int::na()); assert(!column->find_one(grnxx::Int(123)).is_na()); assert(!column->find_one(grnxx::Int(456)).is_na()); assert(column->find_one(grnxx::Int(789)).is_na()); assert(!column->find_one(grnxx::Int::na()).is_na()); column->set(grnxx::Int(1), grnxx::Int::na()); assert(!column->find_one(grnxx::Int(123)).is_na()); assert(column->find_one(grnxx::Int(456)).is_na()); assert(column->find_one(grnxx::Int(789)).is_na()); assert(!column->find_one(grnxx::Int::na()).is_na()); column->set(grnxx::Int(0), grnxx::Int::na()); assert(column->find_one(grnxx::Int(123)).is_na()); assert(column->find_one(grnxx::Int(456)).is_na()); assert(column->find_one(grnxx::Int(789)).is_na()); assert(!column->find_one(grnxx::Int::na()).is_na()); }
void test_contains_and_find_one() { constexpr size_t NUM_ROWS = 1 << 10; // Create a table and insert the first row. auto db = grnxx::open_db(""); auto table = db->create_table("Table"); auto column = table->create_column("Column", T::type()); grnxx::Array<T> values; values.resize(NUM_ROWS); for (size_t i = 0; i < NUM_ROWS; ++i) { generate_random_value(&values[i]); grnxx::Int row_id = table->insert_row(); column->set(row_id, values[i]); } // Test all the values. for (size_t i = 0; i < NUM_ROWS; ++i) { assert(column->contains(values[i])); grnxx::Int row_id = column->find_one(values[i]); assert(!row_id.is_na()); assert(values[i].match(values[row_id.raw()])); } // Test all the values with index if available. try { column->create_index("Index", GRNXX_TREE_INDEX); for (size_t i = 0; i < NUM_ROWS; ++i) { assert(column->contains(values[i])); grnxx::Int row_id = column->find_one(values[i]); assert(!row_id.is_na()); assert(values[i].match(values[row_id.raw()])); } column->remove_index("Index"); } catch (...) { } // Remove N/A values. for (size_t i = 0; i < NUM_ROWS; ++i) { if (values[i].is_na()) { table->remove_row(grnxx::Int(i)); } } // Test all the values. for (size_t i = 0; i < NUM_ROWS; ++i) { if (!values[i].is_na()) { assert(column->contains(values[i])); grnxx::Int row_id = column->find_one(values[i]); assert(!row_id.is_na()); assert(values[i].match(values[row_id.raw()])); } } assert(!column->contains(T::na())); assert(column->find_one(T::na()).is_na()); // Test all the values with index if available. try { column->create_index("Index", GRNXX_TREE_INDEX); for (size_t i = 0; i < NUM_ROWS; ++i) { if (!values[i].is_na()) { assert(column->contains(values[i])); grnxx::Int row_id = column->find_one(values[i]); assert(!row_id.is_na()); assert(values[i].match(values[row_id.raw()])); } } assert(!column->contains(T::na())); assert(column->find_one(T::na()).is_na()); column->remove_index("Index"); } catch (...) { } // Insert a trailing N/A value. table->insert_row_at(grnxx::Int(NUM_ROWS)); assert(column->contains(T::na())); assert(column->find_one(T::na()).match(grnxx::Int(NUM_ROWS))); try { column->create_index("Index", GRNXX_TREE_INDEX); assert(column->contains(T::na())); assert(column->find_one(T::na()).match(grnxx::Int(NUM_ROWS))); column->remove_index("Index"); } catch (...) { } // Remove non-N/A values. for (size_t i = 0; i < NUM_ROWS; ++i) { if (!values[i].is_na()) { table->remove_row(grnxx::Int(i)); } } // Test all the values. for (size_t i = 0; i < NUM_ROWS; ++i) { if (!values[i].is_na()) { assert(!column->contains(values[i])); assert(column->find_one(values[i]).is_na()); } } assert(column->contains(T::na())); assert(column->find_one(T::na()).match(grnxx::Int(NUM_ROWS))); // Test all the values with index if available. try { column->create_index("Index", GRNXX_TREE_INDEX); for (size_t i = 0; i < NUM_ROWS; ++i) { if (!values[i].is_na()) { assert(!column->contains(values[i])); assert(column->find_one(values[i]).is_na()); } } assert(column->contains(T::na())); assert(column->find_one(T::na()).match(grnxx::Int(NUM_ROWS))); column->remove_index("Index"); } catch (...) { } }
static void find_one_index_large_test( void ) { find_one( DB ".index.large" ); }
static void find_one_index_medium_test( void ) { find_one( DB ".index.medium" ); }
static void find_one_index_small_test( void ) { find_one( DB ".index.small" ); }
static void find_one_noindex_large_test( void ) { find_one( DB ".single.large" ); }
static void find_one_noindex_medium_test( void ) { find_one( DB ".single.medium" ); }
static void find_one_noindex_small_test( void ) { find_one( DB ".single.small" ); }