Limit range size to 1,000

pull/217/head
M66B 11 months ago
parent cb15d553c2
commit 9496a7d6a6

@ -124,6 +124,7 @@ import javax.mail.search.SearchTerm;
import javax.mail.search.SentDateTerm; import javax.mail.search.SentDateTerm;
class Core { class Core {
static final int DEFAULT_RANGE_SIZE = 1000;
static final int DEFAULT_CHUNK_SIZE = 50; static final int DEFAULT_CHUNK_SIZE = 50;
private static final int SYNC_BATCH_SIZE = 20; private static final int SYNC_BATCH_SIZE = 20;
@ -4145,6 +4146,10 @@ class Core {
public Object doCommand(IMAPProtocol protocol) throws ProtocolException { public Object doCommand(IMAPProtocol protocol) throws ProtocolException {
protocol.select(folder.name); protocol.select(folder.name);
// Yahoo range size: 2000
// https://help.yahoo.com/kb/download-email-yahoo-mail-third-party-sln28681.html
int range_size = prefs.getInt("range_size", DEFAULT_RANGE_SIZE);
// Build ranges // Build ranges
List<Pair<Long, Long>> ranges = new ArrayList<>(); List<Pair<Long, Long>> ranges = new ArrayList<>();
long first = -1; long first = -1;
@ -4152,7 +4157,7 @@ class Core {
for (long uid : uids) for (long uid : uids)
if (first < 0) if (first < 0)
first = uid; first = uid;
else if ((last < 0 ? first : last) + 1 == uid) else if ((last < 0 ? first : last) + 1 == uid && (uid - first + 1 <= range_size))
last = uid; last = uid;
else { else {
ranges.add(new Pair<>(first, last < 0 ? first : last)); ranges.add(new Pair<>(first, last < 0 ? first : last));
@ -4170,10 +4175,10 @@ class Core {
List<List<Pair<Long, Long>>> chunks = Helper.chunkList(ranges, chunk_size); List<List<Pair<Long, Long>>> chunks = Helper.chunkList(ranges, chunk_size);
Log.i(folder.name + " executing uid fetch count=" + uids.size() + Log.i(folder.name + " executing uid fetch count=" + uids.size() +
" ranges=" + ranges.size() + " chunks=" + chunks.size()); " ranges=" + ranges.size() + " chunks=" + chunks.size() +
" range_size=" + range_size + " chunk_size=" + chunk_size);
for (int c = 0; c < chunks.size(); c++) { for (int c = 0; c < chunks.size(); c++) {
List<Pair<Long, Long>> chunk = chunks.get(c); List<Pair<Long, Long>> chunk = chunks.get(c);
Log.i(folder.name + " chunk #" + c + " size=" + chunk.size());
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (Pair<Long, Long> range : chunk) { for (Pair<Long, Long> range : chunk) {
@ -4184,6 +4189,8 @@ class Core {
else else
sb.append(range.first).append(':').append(range.second); sb.append(range.first).append(':').append(range.second);
} }
Log.i(folder.name + " chunk #" + c + " " + sb);
String command = "UID FETCH " + sb + " (UID FLAGS)"; String command = "UID FETCH " + sb + " (UID FLAGS)";
Response[] responses = protocol.command(command, null); Response[] responses = protocol.command(command, null);

@ -188,6 +188,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private SwitchCompat swOauthTabs; private SwitchCompat swOauthTabs;
private TextView tvStartDelay; private TextView tvStartDelay;
private SeekBar sbStartDelay; private SeekBar sbStartDelay;
private TextView tvRangeSize;
private SeekBar sbRangeSize;
private TextView tvChunkSize; private TextView tvChunkSize;
private SeekBar sbChunkSize; private SeekBar sbChunkSize;
private TextView tvThreadRange; private TextView tvThreadRange;
@ -296,7 +298,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
"sqlite_integrity_check", "wal", "sqlite_checkpoints", "sqlite_analyze", "sqlite_auto_vacuum", "sqlite_sync_extra", "sqlite_cache", "sqlite_integrity_check", "wal", "sqlite_checkpoints", "sqlite_analyze", "sqlite_auto_vacuum", "sqlite_sync_extra", "sqlite_cache",
"legacy_queries", "legacy_queries",
"cache_lists", "oauth_tabs", "cache_lists", "oauth_tabs",
"start_delay", "chunk_size", "thread_range", "start_delay", "range_size", "chunk_size", "thread_range",
"autoscroll_editor", "undo_manager", "autoscroll_editor", "undo_manager",
"browser_zoom", "fake_dark", "browser_zoom", "fake_dark",
"ignore_formatted_size", "ignore_formatted_size",
@ -452,6 +454,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swOauthTabs = view.findViewById(R.id.swOauthTabs); swOauthTabs = view.findViewById(R.id.swOauthTabs);
tvStartDelay = view.findViewById(R.id.tvStartDelay); tvStartDelay = view.findViewById(R.id.tvStartDelay);
sbStartDelay = view.findViewById(R.id.sbStartDelay); sbStartDelay = view.findViewById(R.id.sbStartDelay);
tvRangeSize = view.findViewById(R.id.tvRangeSize);
sbRangeSize = view.findViewById(R.id.sbRangeSize);
tvChunkSize = view.findViewById(R.id.tvChunkSize); tvChunkSize = view.findViewById(R.id.tvChunkSize);
sbChunkSize = view.findViewById(R.id.sbChunkSize); sbChunkSize = view.findViewById(R.id.sbChunkSize);
tvThreadRange = view.findViewById(R.id.tvThreadRange); tvThreadRange = view.findViewById(R.id.tvThreadRange);
@ -1330,6 +1334,27 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
} }
}); });
sbRangeSize.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progress = progress / 10;
if (progress < 1)
progress = 1;
progress = progress * 10;
prefs.edit().putInt("range_size", progress).apply();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Do nothing
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Do nothing
}
});
sbChunkSize.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { sbChunkSize.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@ -2501,6 +2526,10 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
tvStartDelay.setText(getString(R.string.title_advanced_start_delay, start_delay)); tvStartDelay.setText(getString(R.string.title_advanced_start_delay, start_delay));
sbStartDelay.setProgress(start_delay); sbStartDelay.setProgress(start_delay);
int range_size = prefs.getInt("range_size", Core.DEFAULT_RANGE_SIZE);
tvRangeSize.setText(getString(R.string.title_advanced_range_size, range_size));
sbRangeSize.setProgress(range_size);
int chunk_size = prefs.getInt("chunk_size", Core.DEFAULT_CHUNK_SIZE); int chunk_size = prefs.getInt("chunk_size", Core.DEFAULT_CHUNK_SIZE);
tvChunkSize.setText(getString(R.string.title_advanced_chunk_size, chunk_size)); tvChunkSize.setText(getString(R.string.title_advanced_chunk_size, chunk_size));
sbChunkSize.setProgress(chunk_size); sbChunkSize.setProgress(chunk_size);

@ -1234,6 +1234,29 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvStartDelay" /> app:layout_constraintTop_toBottomOf="@id/tvStartDelay" />
<TextView
android:id="@+id/tvRangeSize"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginEnd="48dp"
android:text="@string/title_advanced_range_size"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/sbStartDelay" />
<SeekBar
android:id="@+id/sbRangeSize"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="1000"
android:min="0"
android:progress="100"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvRangeSize" />
<TextView <TextView
android:id="@+id/tvChunkSize" android:id="@+id/tvChunkSize"
android:layout_width="0dp" android:layout_width="0dp"
@ -1244,7 +1267,7 @@
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/sbStartDelay" /> app:layout_constraintTop_toBottomOf="@id/sbRangeSize" />
<SeekBar <SeekBar
android:id="@+id/sbChunkSize" android:id="@+id/sbChunkSize"

@ -957,6 +957,7 @@
<string name="title_advanced_cache_lists" translatable="false">Cache lists</string> <string name="title_advanced_cache_lists" translatable="false">Cache lists</string>
<string name="title_advanced_oauth_tabs" translatable="false">OAuth tabs</string> <string name="title_advanced_oauth_tabs" translatable="false">OAuth tabs</string>
<string name="title_advanced_start_delay" translatable="false">Start delay: %1$d s</string> <string name="title_advanced_start_delay" translatable="false">Start delay: %1$d s</string>
<string name="title_advanced_range_size" translatable="false">Range size: %1$d</string>
<string name="title_advanced_chunk_size" translatable="false">Chunk size: %1$d</string> <string name="title_advanced_chunk_size" translatable="false">Chunk size: %1$d</string>
<string name="title_advanced_thread_range" translatable="false">Thread range: %1$d days</string> <string name="title_advanced_thread_range" translatable="false">Thread range: %1$d days</string>
<string name="title_advanced_auto_scroll" translatable="false">Auto scroll editor</string> <string name="title_advanced_auto_scroll" translatable="false">Auto scroll editor</string>

Loading…
Cancel
Save