change selectBest() logic to favor org name that is in the index.

Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/a1b66850
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/a1b66850
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/a1b66850

Branch: refs/heads/1.x
Commit: a1b6685080f8e23d8e31b2d3b46ea53916d0607a
Parents: 0316b57
Author: Dave Johnson <[email protected]>
Authored: Wed Jan 13 09:31:06 2016 -0500
Committer: Dave Johnson <[email protected]>
Committed: Wed Jan 13 09:31:06 2016 -0500

----------------------------------------------------------------------
 .../usergrid/tools/DuplicateAdminRepair.java    | 63 +++++++++++---------
 .../usergrid/tools/DuplicateOrgRepair.java      | 19 +-----
 .../apache/usergrid/tools/UserOrgInterface.java | 21 ++++++-
 .../apache/usergrid/tools/UserOrgManager.java   | 21 ++++++-
 .../usergrid/tools/MockUserOrgManager.java      | 15 +++++
 5 files changed, 92 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java
----------------------------------------------------------------------
diff --git 
a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java 
b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java
index 9909918..79e403d 100644
--- 
a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java
+++ 
b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java
@@ -154,42 +154,41 @@ public class DuplicateAdminRepair extends ToolBase {
         }
 
         for ( String email : emails.keySet() ) {
+          
+            // go through a set of users with duplicate emails
+            Collection<OrgUser> usersWithDupEmails = emails.get( email );
             
-            Collection<OrgUser> users = emails.get( email );
-
-            if ( users.size() > 1 ) {
-                // get the admin the same way as the rest tier, this way the 
OTHER
-                // admins will be removed
-                OrgUser targetUser = manager.lookupOrgUserByEmail( email );
+            if ( usersWithDupEmails.size() > 1 ) {
+                
+                // get the user that is in the users-by-email index, it's the 
keeper
+                OrgUser indexedUser = manager.lookupOrgUserByEmail( email );
 
-                if ( targetUser == null ) {
+                if ( indexedUser == null ) {
 
-                    List<OrgUser> tempUsers = new ArrayList<OrgUser>( users );
+                    // no user is indexed with that email, pick oldest as 
keeper
+                    List<OrgUser> tempUsers = new ArrayList<OrgUser>( 
usersWithDupEmails );
                     Collections.sort( tempUsers );
+                    OrgUser oldestOfLot = tempUsers.get( 0 );
 
-                    OrgUser toLoad = tempUsers.get( 0 );
-
-                    logger.warn( "Could not load target user by email {}, 
loading by UUID {} instead", email, toLoad );
-                    targetUser = toLoad;
-
-                    users.remove( toLoad );
+                    logger.warn( "Could not load target user by email {}, 
loading by UUID {} instead", email, oldestOfLot );
+                    indexedUser = oldestOfLot;
                 }
 
-                users.remove( targetUser );
-
-                logger.warn( "Found multiple admins with the email {}.  
Retaining uuid {}", email, targetUser.getId() );
+                logger.warn( "Found multiple admins with the email {}.  
Retaining uuid {}", email, indexedUser.getId() );
 
-                for ( OrgUser orgUser : users ) {
-                    mergeAdmins( orgUser, targetUser );
+                for ( OrgUser orgUser : usersWithDupEmails ) {
+                    if ( !orgUser.getId().equals( indexedUser.getId() )) {
+                        mergeAdmins( orgUser, indexedUser );
+                    }
                 }
 
                 // force the index update after all other admins have been 
merged
                 if ( dryRun ) {
                     logger.info("Would force re-index of 'keeper' user {}:{}", 
-                            targetUser.getUsername(), targetUser.getId());
+                            indexedUser.getUsername(), indexedUser.getId());
                 } else {
-                    logger.info( "Forcing re-index of admin with email {} and 
id {}", email, targetUser.getId());
-                    manager.updateOrgUser( targetUser );
+                    logger.info( "Forcing re-index of admin with email {} and 
id {}", email, indexedUser.getId());
+                    manager.updateOrgUser( indexedUser );
                 }
             }
         }
@@ -257,30 +256,36 @@ public class DuplicateAdminRepair extends ToolBase {
 
     /** Merge the source admin to the target admin by copying oranizations. 
Then deletes the source admin */
     private void mergeAdmins( OrgUser sourceUser, OrgUser targetUser ) throws 
Exception {
+        
+        logger.info("---> Merging user {}:{} into {}:{}", new Object[] { 
+               sourceUser.getEmail(), sourceUser.getId(), 
targetUser.getEmail(), targetUser.getId() 
+        } );
 
         Set<Org> sourceOrgs = manager.getUsersOrgs( sourceUser ); 
 
         for ( Org org : sourceOrgs ) {
 
             if ( dryRun ) {
-                logger.info("Would add org {}:{} to user {}:{}", new Object[] {
-                        org.getName(), org.getId(), targetUser.getUsername(), 
targetUser.getId(), });
+                logger.info( "Would add organization {}:{} to admin with email 
{} and id {}",
+                        new Object[] { org.getName(), org.getId(), 
targetUser.getEmail(), targetUser.getId() } );
 
             } else {
                 logger.info( "Adding organization {}:{} to admin with email {} 
and id {}",
-                    new Object[] { org.getName(), org.getId(), 
targetUser.getEmail(), targetUser.getId() } );
+                        new Object[] { org.getName(), org.getId(), 
targetUser.getEmail(), targetUser.getId() } );
 
-                // copy it over to the target admin
+                // add targetUser to sourceUser's org
                 manager.addUserToOrg( targetUser, org );
             }
         }
 
         if ( dryRun ) {
-            logger.info( "Would remove user {}:{}", new Object[]{
-                    sourceUser.getUsername(), sourceUser.getId() } );
+            logger.info( "Would remove admin with email {} and id {} from 
system",
+                    sourceUser.getEmail(), sourceUser.getId() );
             
         } else {
-            logger.info( "Deleting admin with email {} and id {}", 
sourceUser.getEmail(), sourceUser.getId() );
+            logger.info( "Removing admin with email {} and id {} from system",
+                    sourceUser.getEmail(), sourceUser.getId() );
+            
             manager.removeOrgUser( sourceUser );
         }
     }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
----------------------------------------------------------------------
diff --git 
a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java 
b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
index f0f14c7..7b940fa 100644
--- 
a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
+++ 
b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java
@@ -330,7 +330,7 @@ public class DuplicateOrgRepair extends ToolBase {
         
         for ( String dupName : duplicatesByName.keySet() ) {
             Set<Org> duplicateOrgs = duplicatesByName.get(dupName);
-            Org bestOrg = selectBest( duplicateOrgs );
+            Org bestOrg = manager.selectBest( duplicateOrgs );
             
             for ( Org org : duplicateOrgs ) {
                 
@@ -402,7 +402,7 @@ public class DuplicateOrgRepair extends ToolBase {
     private void removeDuplicateOrgs() throws Exception {
         for ( String dupName : duplicatesByName.keySet() ) {
             Set<Org> orgs = duplicatesByName.get( dupName );
-            Org best = selectBest( orgs );
+            Org best = manager.selectBest( orgs );
             for ( Org candidate : orgs ) {
                 if ( !candidate.equals(best) ) {
                     if ( dryRun ) {
@@ -414,21 +414,8 @@ public class DuplicateOrgRepair extends ToolBase {
                 }
             }
         }
+        
         logger.info( "DuplicateOrgRepair renamed/removed duplicate orgs"); 
     }
 
-
-    /**
-     * select best org from a set of duplicates by picking the oldest org
-     */
-    public Org selectBest(Set<Org> orgs) throws Exception {
-        Org oldest = null;
-        for ( Org org :orgs ) {
-            if ( oldest == null || org.compareTo( oldest ) < 0 ) {
-                oldest = org;
-            }
-        }
-        return oldest;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java
----------------------------------------------------------------------
diff --git 
a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java 
b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java
index b756f32..ab4b7e1 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java
@@ -16,6 +16,7 @@
  */
 package org.apache.usergrid.tools;
 
+import org.apache.commons.lang3.builder.EqualsBuilder;
 import rx.Observable;
 
 import java.util.Map;
@@ -63,6 +64,8 @@ interface UserOrgInterface {
     void updateOrgUser(OrgUser targetUserEntity) throws Exception;
 
     void setOrgUserName(OrgUser other, String newUserName) throws Exception;
+    
+    Org selectBest( Set<Org> candidates ) throws Exception;
 
     class Org implements Comparable<Org> {
         private UUID id;
@@ -145,7 +148,23 @@ interface UserOrgInterface {
         public long getCreated() {
             return created;
         }
-        
+
+        @Override
+        public boolean equals( Object obj ) {
+            if (obj == null) { return false; }
+            if (obj == this) { return true; }
+            if (obj.getClass() != getClass()) {
+                return false;
+            }
+            OrgUser rhs = (OrgUser) obj;
+            return new EqualsBuilder().appendSuper(super.equals(obj))
+                    .append(id,       rhs.id)
+                    .append(username, rhs.username)
+                    .append(email,    rhs.email)
+                    .append(created,  rhs.created)
+                    .isEquals();
+        }
+
         @Override
         public int compareTo(OrgUser o) {
             return Long.compare( this.created, o.created );

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java
----------------------------------------------------------------------
diff --git 
a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java 
b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java
index 383fb9b..7f82d35 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java
@@ -343,7 +343,7 @@ class UserOrgManager implements UserOrgInterface {
         em.update( user );
     }
 
-    
+
     @Override
     public void setOrgUserName(OrgUser other, String newUserName ) throws 
Exception {
         
@@ -363,4 +363,23 @@ class UserOrgManager implements UserOrgInterface {
             setOrgUserName( other, String.format( "%s-%s", 
other.getUsername(), other.getId() ) );
         }
     }
+
+
+    /**
+     * Select best org from a set of duplicates by picking the one that is 
indexed, or the oldest.
+     */
+    @Override
+    public Org selectBest(Set<Org> orgs) throws Exception {
+        Org oldest = null;
+        for ( Org org :orgs ) {
+            OrganizationInfo info = managementService.getOrganizationByName( 
org.getName() );
+            if ( info != null ) {
+                return org; 
+            }
+            if ( oldest == null || org.compareTo( oldest ) < 0 ) {
+                oldest = org;
+            }
+        }
+        return oldest;
+    }
 }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java
----------------------------------------------------------------------
diff --git 
a/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java 
b/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java
index 818c1b8..4e2fd95 100644
--- 
a/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java
+++ 
b/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java
@@ -221,6 +221,21 @@ class MockUserOrgManager implements UserOrgInterface {
         updateOrgUser( user ); // re-index user
     }
 
+    /**
+     * select best org from a set of duplicates by picking the oldest org
+     */
+    @Override
+    public Org selectBest(Set<Org> orgs) throws Exception {
+        Org oldest = null;
+        for ( Org org :orgs ) {
+            if ( oldest == null || org.compareTo( oldest ) < 0 ) {
+                oldest = org;
+            }
+        }
+        return oldest;
+    }
+    
+
     // implemented for testing only
     OrgUser createOrgUser(UUID id, String name, String email) {
         OrgUser user = new OrgUser( id, name, email );

Reply via email to