Filter by region for updates

apache_commons_compress
Terekhin Alexander 5 years ago
parent 1e40707633
commit 7afbe9ef92
  1. 24
      src/main/java/me/bearns/fias/domain/FiasVersion.java
  2. 29
      src/main/java/me/bearns/fias/service/FiasUpdater.java
  3. 13
      src/main/java/me/bearns/fias/util/RegionFilter.java
  4. 3
      src/main/resources/db/changelog/000_initial_schema.yaml

@ -32,6 +32,9 @@ public class FiasVersion {
@Column(name = "delta_xml_url") @Column(name = "delta_xml_url")
protected String fiasDeltaXmlUrl; protected String fiasDeltaXmlUrl;
@Column(name = "regions")
protected String regions;
public Long getVersionId() { public Long getVersionId() {
return versionId; return versionId;
} }
@ -47,4 +50,25 @@ public class FiasVersion {
public String getFiasDeltaXmlUrl() { public String getFiasDeltaXmlUrl() {
return fiasDeltaXmlUrl; return fiasDeltaXmlUrl;
} }
public String getRegions() {
return regions;
}
public void setRegions(Long ... regions) {
StringBuilder sb = new StringBuilder();
for(Long region : regions) {
if((region != null) && (region > 0) && (region < 100)){
if(sb.length() > 0) sb.append(",");
sb.append(String.format("%1$02d", region));
}
}
this.regions = sb.length() > 0 ? sb.toString() : null;
}
public void setRegions(String regions){
this.regions = regions;
}
} }

@ -15,6 +15,7 @@ import java.io.*;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.function.Predicate;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipException; import java.util.zip.ZipException;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
@ -46,6 +47,7 @@ public class FiasUpdater implements Updater {
if(dbVersionObj != null) { if(dbVersionObj != null) {
final Long dbVersion = dbVersionObj.getVersionId(); final Long dbVersion = dbVersionObj.getVersionId();
final String regions = dbVersionObj.getRegions();
final long lastOnlineVersion = clientStub.getLastVersionId(); final long lastOnlineVersion = clientStub.getLastVersionId();
@ -54,6 +56,9 @@ public class FiasUpdater implements Updater {
final List<FiasVersion> updates = clientStub.getVersionsAfter(dbVersion); final List<FiasVersion> updates = clientStub.getVersionsAfter(dbVersion);
//set region filters for updates
if(regions != null) updates.forEach(u -> u.setRegions(regions));
if(updates != null && !updates.isEmpty()) { if(updates != null && !updates.isEmpty()) {
processUpdates(updates, false); processUpdates(updates, false);
} }
@ -67,14 +72,19 @@ public class FiasUpdater implements Updater {
public void reload(Long... regions) throws CommonException { public void reload(Long... regions) throws CommonException {
final List<FiasVersion> lastVersion = clientStub.getLastVersion(); final List<FiasVersion> lastVersion = clientStub.getLastVersion();
if(lastVersion != null) {
processUpdates(lastVersion, true, regions); //exist and only one
if(lastVersion != null && lastVersion.size() == 1) {
//set region filter
lastVersion.get(0).setRegions(regions);
processUpdates(lastVersion, true);
} }
} }
//transaction from here //transaction from here
private void processUpdates(List<FiasVersion> updates, boolean reloadFlag, Long ... regions) throws CommonException { private void processUpdates(List<FiasVersion> updates, boolean reloadFlag) throws CommonException {
if(reloadFlag) { if(reloadFlag) {
//todo reload flag impl //todo reload flag impl
@ -91,13 +101,20 @@ public class FiasUpdater implements Updater {
//strict order //strict order
for (FiasVersion item : updates) { for (FiasVersion item : updates) {
//set region filter
final String regions = item.getRegions();
RegionFilter filter = null;
if(regions != null) {
filter = new RegionFilter(regions);
}
final File file; final File file;
try { try {
//wait for downloading //wait for downloading
file = map.get(item).get(); file = map.get(item).get();
//process update //process update
processArchive(file, regions); processArchive(file, filter);
//apply this version //apply this version
versions.save(item); versions.save(item);
@ -113,7 +130,7 @@ public class FiasUpdater implements Updater {
} }
} }
private void processArchive(File file, Long ... regions) throws CommonException { private void processArchive(File file, Predicate filter) throws CommonException {
try(final ZipFile zipFile = new ZipFile(file)){ try(final ZipFile zipFile = new ZipFile(file)){
@ -123,8 +140,6 @@ public class FiasUpdater implements Updater {
final ZipEntry entry = entries.nextElement(); final ZipEntry entry = entries.nextElement();
final RegionFilter filter = regions != null ? new RegionFilter(regions) : null;
final UnmarshallerParameters config = catalog.getByPrefix(entry.getName()); final UnmarshallerParameters config = catalog.getByPrefix(entry.getName());
if(config!=null) { //todo if(config!=null) { //todo

@ -3,7 +3,9 @@ package me.bearns.fias.util;
import me.bearns.fias.domain.Addrobj; import me.bearns.fias.domain.Addrobj;
import me.bearns.fias.domain.House; import me.bearns.fias.domain.House;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
@ -11,14 +13,9 @@ public class RegionFilter implements Predicate {
private final Set<String> set = new HashSet<>(); private final Set<String> set = new HashSet<>();
public RegionFilter(Long[] codes) { public RegionFilter(String codes) {
for (Long code : codes){ if(codes!=null){
if(code>0L && code<100L) { Arrays.stream(codes.split(",")).filter(Objects::nonNull).filter(s -> s.matches("^\\d{2}$")).forEach(set::add);
set.add(String.format("%1$02d", code));
} else {
//todo
//log.warn("Element out of range: {}", code);
}
} }
} }

@ -21,3 +21,6 @@ databaseChangeLog:
- column: - column:
name: delta_xml_url name: delta_xml_url
type: varchar type: varchar
- column:
name: regions
type: varchar
Loading…
Cancel
Save