bool UpdateIndexData::mightBeIndexed(const FieldRef& path) const { if (_allPathsIndexed) { return true; } FieldRef canonicalPath = getCanonicalIndexField(path); for (const auto& idx : _canonicalPaths) { if (_startsWith(canonicalPath, idx) || _startsWith(idx, canonicalPath)) return true; } for (const auto& pathComponent : _pathComponents) { for (size_t partIdx = 0; partIdx < path.numParts(); ++partIdx) { if (pathComponent == path.getPart(partIdx)) { return true; } } } return false; }
TEST( UpdateIndexDataTest, getCanonicalIndexField1 ) { string x; ASSERT_FALSE( getCanonicalIndexField( "a", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "aaa", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.b", &x ) ); ASSERT_TRUE( getCanonicalIndexField( "a.$", &x ) ); ASSERT_EQUALS( x, "a" ); ASSERT_TRUE( getCanonicalIndexField( "a.0", &x ) ); ASSERT_EQUALS( x, "a" ); ASSERT_TRUE( getCanonicalIndexField( "a.123", &x ) ); ASSERT_EQUALS( x, "a" ); ASSERT_TRUE( getCanonicalIndexField( "a.$.b", &x ) ); ASSERT_EQUALS( x, "a.b" ); ASSERT_TRUE( getCanonicalIndexField( "a.0.b", &x ) ); ASSERT_EQUALS( x, "a.b" ); ASSERT_TRUE( getCanonicalIndexField( "a.123.b", &x ) ); ASSERT_EQUALS( x, "a.b" ); ASSERT_FALSE( getCanonicalIndexField( "a.$ref", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.$ref.b", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.c$d.b", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.123a", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.a123", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.123a.b", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.a123.b", &x ) ); ASSERT_FALSE( getCanonicalIndexField( "a.", &x ) ); }
void UpdateIndexData::addPath(const FieldRef& path) { _canonicalPaths.insert(getCanonicalIndexField(path)); }