-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
#716 | Reset role and ensure organisation when syncing for Location a…
…nd LocationMapping
- Loading branch information
Showing
12 changed files
with
164 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
avni-server-api/src/main/java/org/avni/server/dao/LocationMappingSyncRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
package org.avni.server.dao; | ||
|
||
import org.avni.server.domain.AddressLevel; | ||
import org.avni.server.domain.ParentLocationMapping; | ||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Slice; | ||
import org.springframework.stereotype.Repository; | ||
|
||
import javax.persistence.EntityManager; | ||
import javax.transaction.Transactional; | ||
|
||
/** | ||
* LocationSyncRepository uses the postgres @> keyword for sync, which does not index well and creates poor plans. | ||
* This is a performance enhancement that temporarily switches out the role of the user before running this query. | ||
* | ||
*/ | ||
@Repository | ||
public class LocationMappingSyncRepository extends RoleSwitchableRepository implements SyncableRepository<ParentLocationMapping> { | ||
private LocationMappingRepository locationMappingRepository; | ||
|
||
public LocationMappingSyncRepository(EntityManager entityManager, LocationMappingRepository locationMappingRepository) { | ||
super(entityManager); | ||
this.locationMappingRepository = locationMappingRepository; | ||
} | ||
|
||
@Override | ||
public boolean isEntityChanged(SyncParameters syncParameters) { | ||
return locationMappingRepository.isEntityChanged(syncParameters); | ||
} | ||
|
||
@Override | ||
public Slice<ParentLocationMapping> getSyncResultsAsSlice(SyncParameters syncParameters) { | ||
return locationMappingRepository.getSyncResultsAsSlice(syncParameters); | ||
} | ||
|
||
|
||
@Override | ||
@Transactional | ||
public Page<ParentLocationMapping> getSyncResults(SyncParameters syncParameters) { | ||
try { | ||
setRoleToNone(); | ||
Page<ParentLocationMapping> syncResults = locationMappingRepository.getSyncResults(syncParameters); | ||
return syncResults; | ||
} finally { | ||
setRoleBackToUser(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
41 changes: 41 additions & 0 deletions
41
avni-server-api/src/main/java/org/avni/server/dao/LocationSyncRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package org.avni.server.dao; | ||
|
||
import org.avni.server.domain.AddressLevel; | ||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Slice; | ||
import org.springframework.stereotype.Repository; | ||
|
||
import javax.persistence.EntityManager; | ||
import javax.transaction.Transactional; | ||
|
||
@Repository | ||
public class LocationSyncRepository extends RoleSwitchableRepository implements SyncableRepository<AddressLevel> { | ||
private LocationRepository locationRepository; | ||
|
||
public LocationSyncRepository(EntityManager entityManager, LocationRepository locationRepository) { | ||
super(entityManager); | ||
this.locationRepository = locationRepository; | ||
} | ||
|
||
@Override | ||
public boolean isEntityChanged(SyncParameters syncParameters) { | ||
return locationRepository.isEntityChanged(syncParameters); | ||
} | ||
|
||
@Override | ||
public Slice<AddressLevel> getSyncResultsAsSlice(SyncParameters syncParameters) { | ||
return locationRepository.getSyncResultsAsSlice(syncParameters); | ||
} | ||
|
||
@Override | ||
@Transactional | ||
public Page<AddressLevel> getSyncResults(SyncParameters syncParameters) { | ||
try { | ||
setRoleToNone(); | ||
Page<AddressLevel> syncResults = locationRepository.getSyncResults(syncParameters); | ||
return syncResults; | ||
} finally { | ||
setRoleBackToUser(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
26 changes: 26 additions & 0 deletions
26
avni-server-api/src/main/java/org/avni/server/dao/RoleSwitchableRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package org.avni.server.dao; | ||
|
||
import org.avni.server.framework.security.UserContextHolder; | ||
|
||
import javax.persistence.EntityManager; | ||
import javax.persistence.PersistenceContext; | ||
import javax.persistence.Query; | ||
|
||
public class RoleSwitchableRepository { | ||
@PersistenceContext | ||
protected EntityManager entityManager; | ||
|
||
public RoleSwitchableRepository(EntityManager entityManager) { | ||
this.entityManager = entityManager; | ||
} | ||
|
||
protected void setRoleBackToUser() { | ||
Query setRoleBackToWhatever = entityManager.createNativeQuery("set role \"" + UserContextHolder.getOrganisation().getDbUser() + "\""); | ||
setRoleBackToWhatever.executeUpdate(); | ||
} | ||
|
||
protected void setRoleToNone() { | ||
Query resetQuery = entityManager.createNativeQuery("reset role;"); | ||
resetQuery.executeUpdate(); | ||
} | ||
} |
10 changes: 10 additions & 0 deletions
10
avni-server-api/src/main/java/org/avni/server/dao/SyncableRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package org.avni.server.dao; | ||
|
||
import org.springframework.data.domain.Page; | ||
import org.springframework.data.domain.Slice; | ||
|
||
public interface SyncableRepository<T> { | ||
Page<T> getSyncResults(SyncParameters syncParameters); | ||
boolean isEntityChanged(SyncParameters syncParameters); | ||
Slice<T> getSyncResultsAsSlice(SyncParameters syncParameters); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.