[
https://issues.apache.org/jira/browse/OAK-4119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15195091#comment-15195091
]
angela commented on OAK-4119:
-----------------------------
[~tmueller], here some additional query specific information for your interest.
The proposed patch (OAK-4119_3) will run the following queries and add a new
index for {{rep:members}} property (as follows).
h5. Index Definition in UserInitializer
{code}
NodeUtil members = IndexUtils.createIndexDefinition(index, "members", false,
new String[]{REP_MEMBERS},
new String[]{NT_REP_MEMBER_REFERENCES});
members.setString("info", "Oak index used by the user management to lookup
group membership.");
{code}
h5. Query for any Reference in (sub)-Tree
- see {{IdentifierManager.hasAnyReferenceInPath}} and commons {{QueryUtils}}
- statement
{code}
SELECT * FROM [rep:MemberReferences] AS s WHERE ISSAMENODE
('/rep:security/rep:authorizables/rep:groups/t/te/testGroup0') AND
PROPERTY([rep:members], 'WeakReference') =
'c500b58d-122a-3651-9c69-8b889a8a4771' union SELECT * FROM
[rep:MemberReferences] AS s WHERE ISDESCENDANTNODE
('/rep:security/rep:authorizables/rep:groups/t/te/testGroup0') AND
PROPERTY([rep:members], 'WeakReference') =
'c500b58d-122a-3651-9c69-8b889a8a4771' /* oak-internal */
{code}
h5. Query for all References with propName + single ntName
- see new, simplified {{IdentifierManager.getReferences}}
- statement
{code}
SELECT * FROM [rep:MemberReferences] WHERE PROPERTY([rep:members],
'WeakReference') = $uuid /* oak-internal */
{code}
> Improvements Take 1
> -------------------
>
> Key: OAK-4119
> URL: https://issues.apache.org/jira/browse/OAK-4119
> Project: Jackrabbit Oak
> Issue Type: Improvement
> Components: core
> Reporter: angela
> Assignee: angela
> Attachments: OAK-4119.patch, OAK-4119_2.patch, OAK-4119_tests.patch
>
>
> First bunch of potential improvements to be tested/verified using the
> benchmarks:
> h4. General
> - dedicated index for {{rep:members}} property defined by nt
> {{rep:MemberReferences}} (=> mod in {{UserInitializer}})
> - adjust nt-handling in {{IdentifierManager.getReferences}} : if a single nt
> name is specified in the {{nodeTypeNames}} param it is inserted in the query
> statement instead of looking for {{nt:base}}
> - introduce {{hasAnyReferenceInPath}}, which allows to search for any
> references being located in a give subtree of the repository (with TODOs)
> - {{MembershipProvider.MemberReferenceIterator}}: keeping track of processed
> references is optional i.e. an implementation detail
> - {{MembershipProvider.AbstractMemberIterator}}: no more protected fields
> (patch OAK-4119_2)
> - {{MembershipProvider.AbstractMemberIterator}}: breadth-first iteration
> before performing queries for the inherited members/membership (patch
> OAK-4119_2)
> h4. Group.isMember
> - {{MembershipProvider}}: introduce shortcut if a Group doesn't have any
> members
> - {{MembershipProvider}}: keep old logic if the target Group has
> (potentially) pending changes
> - {{MembershipProvider}}: for unmodified Groups use reverse membership
> lookup of the target authorizable instead (patch OAK-4119_2: further
> optimizes 'hasMembership' as the {{AbstractMemberIterator}} doesn't need to
> search for the complete membership; limiting the number of queries to be
> executed. see above)
> - {{GroupImpl}}: add shortcut if member to be tested is a Group representing
> the {{EveryonePrincipal}}
> h4. Group.isDeclaredMember
> - introduce shortcut if a Group doesn't have any members
> - keep old logic if target Group (potentially) has pending changes or if the
> number of members is small (=> threshold with {{MembershipProvider}})
> - minor change with the old behavior, which does no longer keep track of
> processed references, which is not needed here
> - for unmodified Groups with plenty of members use
> {{IdentifierManager.hasAnyReferenceInPath}}
> - All modifications in {{MembershipProvider}}
> h4. Group.addMember(Authorizable)
> - {{GroupImpl}}: drop extra test for circular membership, which is anyway
> enforced by the {{UserValidator}} => needs adjustment of test-cases that
> expect this to be detected immediately => intoducing save-call to verify if
> cycles are properly detected latest during commit.
> - {{UserValidator}}: if {{isMember}} is improved by the changes above, the
> check for circular membership would be faster as well
> h4. Group.addMembers(String...)
> - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}}
> that don't take a single contentID but rather a Map of contentID:memberID and
> returns the set of memberIDs that could not be processed successfully.
> - consequently finding the best {{rep:members property}} and avoiding
> duplicate membership is performed only once for the batch of ids to be added
> - Note: once best-property reaches threshold new member-ref nodes will be
> created
> h4. Group.removeMembers(String...)
> - introduce new methods on {{MembershipProvider}} and {{{{MembershipWriter}}
> that don't take a single contentID but rather a Map of contentID:memberID and
> returns the set of memberIDs that could not be processed successfully.
> - consequently for a given batch of ids the declared member are traversed
> only once
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)