package com.fastaccess.data.dao.model; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import com.fastaccess.App; import com.fastaccess.data.dao.CommitFileListModel; import com.fastaccess.data.dao.CommitListModel; import com.fastaccess.data.dao.GitCommitModel; import com.fastaccess.data.dao.GithubState; import com.fastaccess.data.dao.converters.CommitFilesConverter; import com.fastaccess.data.dao.converters.CommitsConverter; import com.fastaccess.data.dao.converters.GitCommitConverter; import com.fastaccess.data.dao.converters.GitHubStateConverter; import com.fastaccess.data.dao.converters.RepoConverter; import com.fastaccess.data.dao.converters.UserConverter; import com.fastaccess.helper.RxHelper; import com.google.gson.annotations.SerializedName; import java.util.List; import io.requery.Column; import io.requery.Convert; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; import io.requery.Nullable; import io.requery.Persistable; import io.requery.Table; import io.requery.rx.SingleEntityStore; import lombok.NoArgsConstructor; import rx.Observable; import rx.Single; import static com.fastaccess.data.dao.model.Commit.LOGIN; import static com.fastaccess.data.dao.model.Commit.PULL_REQUEST_NUMBER; import static com.fastaccess.data.dao.model.Commit.REPO_ID; import static com.fastaccess.data.dao.model.Commit.SHA; @Entity @NoArgsConstructor @Table(name = "commit_table") public abstract class AbstractCommit implements Parcelable { @Key @Generated long id; String url; String sha; String htmlUrl; String login; String repoId; long pullRequestNumber; @Convert(GitHubStateConverter.class) GithubState stats; @Convert(CommitFilesConverter.class) CommitFileListModel files; @Convert(CommitsConverter.class) CommitListModel parents; @Column(name = "ref_column") String ref; @SerializedName("distincted") boolean distincted; @SerializedName("commit") @Convert(GitCommitConverter.class) GitCommitModel gitCommit; @Convert(UserConverter.class) User author; @Convert(UserConverter.class) User committer; @Convert(RepoConverter.class) Repo repo; @Column(name = "user_column") @Convert(UserConverter.class) User user; @Nullable int commentCount; public Single save(Commit modelEntity) { return App.getInstance() .getDataStore() .insert(modelEntity); } public static Observable save(@NonNull List<Commit> models, @NonNull String repoId, @NonNull String login) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(Commit.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login))) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(models)) .flatMap(commitModel -> { commitModel.setRepoId(repoId); commitModel.setLogin(login); return commitModel.save(commitModel).toObservable(); })); } public static Observable save(@NonNull List<Commit> models, @NonNull String repoId, @NonNull String login, long number) { SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore(); return RxHelper.safeObservable(singleEntityStore.delete(Commit.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login)) .and(PULL_REQUEST_NUMBER.eq(number))) .get() .toSingle() .toObservable() .flatMap(integer -> Observable.from(models)) .flatMap(commitModel -> { commitModel.setRepoId(repoId); commitModel.setLogin(login); commitModel.setPullRequestNumber(number); return commitModel.save(commitModel).toObservable(); })); } public static Observable<List<Commit>> getCommits(@NonNull String repoId, @NonNull String login) { return App.getInstance().getDataStore() .select(Commit.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login)) .and(PULL_REQUEST_NUMBER.eq(0L))) .get() .toObservable() .toList(); } public static Observable<List<Commit>> getCommits(@NonNull String repoId, @NonNull String login, long pullRequestNumber) { return App.getInstance().getDataStore() .select(Commit.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login)) .and(PULL_REQUEST_NUMBER.eq(pullRequestNumber))) .get() .toObservable() .toList(); } public static Observable<Commit> getCommit(@NonNull String sha, @NonNull String repoId, @NonNull String login) { return App.getInstance().getDataStore() .select(Commit.class) .where(REPO_ID.eq(repoId) .and(LOGIN.eq(login)) .and(SHA.eq(sha))) .limit(1) .get() .toObservable(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(this.id); dest.writeString(this.url); dest.writeString(this.sha); dest.writeString(this.htmlUrl); dest.writeString(this.login); dest.writeString(this.repoId); dest.writeLong(this.pullRequestNumber); dest.writeParcelable(this.stats, flags); dest.writeList(this.files); dest.writeList(this.parents); dest.writeString(this.ref); dest.writeByte(this.distincted ? (byte) 1 : (byte) 0); dest.writeParcelable(this.gitCommit, flags); dest.writeParcelable(this.author, flags); dest.writeParcelable(this.committer, flags); dest.writeParcelable(this.repo, flags); dest.writeParcelable(this.user, flags); dest.writeInt(this.commentCount); } protected AbstractCommit(Parcel in) { this.id = in.readLong(); this.url = in.readString(); this.sha = in.readString(); this.htmlUrl = in.readString(); this.login = in.readString(); this.repoId = in.readString(); this.pullRequestNumber = in.readLong(); this.stats = in.readParcelable(GithubState.class.getClassLoader()); this.files = new CommitFileListModel(); in.readList(this.files, this.files.getClass().getClassLoader()); this.parents = new CommitListModel(); in.readList(this.parents, this.parents.getClass().getClassLoader()); this.ref = in.readString(); this.distincted = in.readByte() != 0; this.gitCommit = in.readParcelable(GitCommitModel.class.getClassLoader()); this.author = in.readParcelable(User.class.getClassLoader()); this.committer = in.readParcelable(User.class.getClassLoader()); this.repo = in.readParcelable(Repo.class.getClassLoader()); this.user = in.readParcelable(User.class.getClassLoader()); this.commentCount = in.readInt(); } public static final Creator<Commit> CREATOR = new Creator<Commit>() { @Override public Commit createFromParcel(Parcel source) {return new Commit(source);} @Override public Commit[] newArray(int size) {return new Commit[size];} }; }