Skip to content

Commit

Permalink
Refactor observer execution and handle null observer to limit calls i…
Browse files Browse the repository at this point in the history
…nto the storage - change getById signature to int
  • Loading branch information
tspoke committed May 4, 2017
1 parent 310d606 commit 0af8545
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 81 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public class MyStoreService<T> extends AbstractService<T> {
}
```

Or use one implemented on this library :
Have a look to existing implementations :

- Realm : https://github.com/playmoweb/store2realm

Expand Down
2 changes: 1 addition & 1 deletion store2store/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ dependencies {
exclude group: 'com.android.support', module: 'support-annotations'
})

compile 'com.android.support:appcompat-v7:25.1.1'
compile 'com.android.support:appcompat-v7:25.3.1'
compile "io.reactivex:rxandroid:1.2.1"

testCompile 'junit:junit:4.12'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ protected Observable<TestModel> getOne(Filter filter, SortingMode sortingMode) {
}

@Override
protected Observable<TestModel> getById(String id) {
protected Observable<TestModel> getById(int id) {
return myCustomAPI.getById(id);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,10 @@ public Observable<TestModel> getOne(Filter filter, SortingMode sortingMode) {
}

@Override
public Observable<TestModel> getById(String id) {
int integerId = Integer.valueOf(id);
public Observable<TestModel> getById(int id) {
TestModel t = null;
for(TestModel tm : models) {
if(tm.getId() == integerId) {
if(tm.getId() == id) {
t = tm;
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public interface IStoreDao<T> {
* @param id
* @return
*/
Observable<T> getById(String id);
Observable<T> getById(int id);

/**
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public abstract class AbstractService<T> implements IService<T> {
/**
* The storage used by this manager
*/
private IStoreDao<T> storage;
private final IStoreDao<T> storage;

/**
* A local subscription to handle local observers
Expand All @@ -56,7 +56,7 @@ public IStoreDao<T> getStorage() {

@Override
public Observable<List<T>> getAll(final Filter filter, final SortingMode sortingMode, CustomObserver<List<T>> otherSubscriber) {
final Subscription s = getAll(filter, sortingMode)
Observable<List<T>> observable = getAll(filter, sortingMode)
.flatMap(new Func1<List<T>, Observable<List<T>>>() {
@Override
public Observable<List<T>> call(final List<T> ts) {
Expand All @@ -74,12 +74,9 @@ public Observable<List<T>> call(List<T> ts) {
storage.insertOrUpdate(ts);
return storage.getAll(filter, sortingMode);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.getAll(filter, sortingMode);
}

Expand All @@ -88,46 +85,36 @@ public final Observable<List<T>> getAll(final CustomObserver<List<T>> otherSubsc
}

@Override
public final Observable<T> getById(final String id, final CustomObserver<T> otherSubscriber) {
final Subscription s = getById(id)
public final Observable<T> getById(final int id, final CustomObserver<T> otherSubscriber) {
Observable<T> observable = getById(id)
.flatMap(new Func1<T, Observable<T>>() {
@Override
public Observable<T> call(T itemFromAsync) {
return storage.insertOrUpdate(itemFromAsync);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.getOne(new Filter("id", id), null);
}

public final Observable<T> getById(final int idValue, final CustomObserver<T> otherSubscriber) {
return getById(String.valueOf(idValue), otherSubscriber);
}

@Override
public Observable<T> getOne(Filter filter, SortingMode sortingMode, CustomObserver<T> otherSubscriber) {
final Subscription s = getOne(filter, sortingMode)
Observable<T> observable = getOne(filter, sortingMode)
.flatMap(new Func1<T, Observable<T>>() {
@Override
public Observable<T> call(T itemFromAsync) {
return storage.insertOrUpdate(itemFromAsync);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.getOne(filter, sortingMode);
}

@Override
public Observable<T> insert(final T object, CustomObserver<T> otherSubscriber) {
final Subscription s = insert(object)
Observable<T> observable = insert(object)
.onErrorResumeNext(new Func1<Throwable, Observable<T>>() {
@Override
public Observable<T> call(final Throwable throwable) {
Expand All @@ -144,18 +131,15 @@ public Observable<T> call(Void aVoid) {
public Observable<T> call(T item) {
return storage.insertOrUpdate(item);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.insertOrUpdate(object);
}

@Override
public Observable<List<T>> insert(final List<T> objects, CustomObserver<List<T>> otherSubscriber) {
final Subscription s = insert(objects)
Observable<List<T>> observable = insert(objects)
.onErrorResumeNext(new Func1<Throwable, Observable<List<T>>>() {
@Override
public Observable<List<T>> call(final Throwable throwable) {
Expand All @@ -172,52 +156,43 @@ public Observable<List<T>> call(Void aVoid) {
public Observable<List<T>> call(List<T> items) {
return storage.insertOrUpdate(items);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.insertOrUpdate(objects);
}

@Override
public Observable<T> update(final T object, CustomObserver<T> otherSubscriber) {
final Subscription s = update(object)
Observable<T> observable = update(object)
.flatMap(new Func1<T, Observable<T>>() {
@Override
public Observable<T> call(T item) {
return storage.insertOrUpdate(item);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return Observable.just(object);
}

@Override
public Observable<List<T>> update(final List<T> objects, CustomObserver<List<T>> otherSubscriber) {
final Subscription s = update(objects)
Observable<List<T>> observable = update(objects)
.flatMap(new Func1<List<T>, Observable<List<T>>>() {
@Override
public Observable<List<T>> call(List<T> items) {
return storage.insertOrUpdate(items);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.insertOrUpdate(objects);
}

@Override
public Observable<Void> delete(final T object, CustomObserver<Void> otherSubscriber) {
final Subscription s = delete(object)
Observable<Void> observable = delete(object)
.onErrorResumeNext(new Func1<Throwable, Observable<Void>>() {
@Override
public Observable<Void> call(final Throwable throwable) {
Expand All @@ -228,18 +203,15 @@ public Observable<Void> call(T item) {
}
});
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.delete(object);
}

@Override
public Observable<Void> delete(final List<T> objects, CustomObserver<Void> otherSubscriber) {
final Subscription s = delete(objects)
Observable<Void> observable = delete(objects)
.onErrorResumeNext(new Func1<Throwable, Observable<Void>>() {
@Override
public Observable<Void> call(final Throwable throwable) {
Expand All @@ -250,18 +222,15 @@ public Observable<Void> call(List<T> items) {
}
});
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.delete(objects);
}

@Override
public Observable<Void> deleteAll(CustomObserver<Void> otherSubscriber) {
final Subscription s = deleteAll()
Observable<Void> observable = deleteAll()
.onErrorResumeNext(new Func1<Throwable, Observable<Void>>() {
@Override
public Observable<Void> call(final Throwable throwable) {
Expand All @@ -278,15 +247,30 @@ public Observable<Void> call(List<T> ts) {
}
});
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
});

subscriptions.add(s);
subscribeNonNullObserver(observable, otherSubscriber);
return storage.deleteAll();
}

/**
* This method execute an observable only if the subscriber exists.
*
* @note The defaults schedulers are io() for subscribeOn and Android.mainThread() for observeOn.
* @param observable
* @param otherSubscriber
* @param <S>
*/
private <S> void subscribeNonNullObserver(final Observable<S> observable, final CustomObserver<S> otherSubscriber) {
if(observable != null && otherSubscriber != null) {
final Subscription s = observable
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new SimpleObserver<>(otherSubscriber));
subscriptions.add(s);
}
}

/**************************************************************************
* Abstracts protected methods called by operations above
*************************************************************************/
Expand All @@ -311,7 +295,7 @@ public Observable<Void> call(List<T> ts) {
* @param id
* @return
*/
protected abstract Observable<T> getById(String id);
protected abstract Observable<T> getById(int id);

/**
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public interface IService<T> {
* @param otherSubscriber
* @return
*/
Observable<T> getById(final String id, final CustomObserver<T> otherSubscriber);
Observable<T> getById(final int id, final CustomObserver<T> otherSubscriber);

/**
* Get one object for filter and sorting mode
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.playmoweb.store2store.utils;

import java.util.List;
import java.util.WeakHashMap;

/**
Expand All @@ -8,29 +9,51 @@
public class Filter extends WeakHashMap<String, Filter.KeyValuePair> {
// TODO optimize access with a copy in an weak list

public <T> Filter(String key, T value) {
public Filter() {
super();
add(key, FilterType.EQUAL, value);
}

public <T> Filter(String key, T value) {
this(key, FilterType.EQUAL, value);
}

public <T> Filter(String key, FilterType type, T value) {
super();
add(key, type, value);
}

public <T> Filter add(String key, T value) {
this.put(key, new KeyValuePair<>(FilterType.EQUAL, value));
return this;
}

public <T> Filter add(String key, FilterType type, T value) {
this.put(key, new KeyValuePair<>(type, value));
return this;
}

public <T> Filter add(String key, FilterType type, List<T> values) {
for(T value : values) {
this.put(key, new KeyValuePair<>(type, value));
}
return this;
}

public <T> Filter add(String key, FilterType type, T[] values) {
for(T value : values) {
this.put(key, new KeyValuePair<>(type, value));
}
return this;
}

/**
* Immutable KeyValuePair class
*/
public static class KeyValuePair<T> {
public final FilterType filterType;
public final T value;
static class KeyValuePair<T> {
final FilterType filterType;
final T value;

public KeyValuePair(FilterType ft, T v){
KeyValuePair(FilterType ft, T v){
value = v;
filterType = ft;
}
Expand Down

0 comments on commit 0af8545

Please sign in to comment.