package com.hp.autonomy.frontend.find.core.savedsearches.snapshot;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.hp.autonomy.frontend.find.core.savedsearches.SavedSearch;
import com.hp.autonomy.frontend.find.core.savedsearches.SavedSearchType;
import com.hp.autonomy.searchcomponents.core.search.TypedStateToken;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import java.util.Set;
@Entity
@DiscriminatorValue(SavedSearchType.Values.SNAPSHOT)
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@JsonDeserialize(builder = SavedSnapshot.Builder.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SavedSnapshot extends SavedSearch<SavedSnapshot, SavedSnapshot.Builder> {
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = StoredStateTable.NAME, joinColumns = @JoinColumn(name = StoredStateTable.Column.SEARCH_ID))
private Set<TypedStateToken> stateTokens;
@Column(name = Table.Column.TOTAL_RESULTS)
private Long resultCount;
private SavedSnapshot(final Builder builder) {
super(builder);
stateTokens = builder.stateTokens;
resultCount = builder.resultCount;
}
@Override
public Builder toBuilder() {
return new Builder(this);
}
@Override
protected void mergeInternal(final SavedSnapshot other) {
stateTokens = other.stateTokens == null ? stateTokens : other.stateTokens;
resultCount = other.resultCount == null ? resultCount : other.resultCount;
}
@NoArgsConstructor
@Setter
@Accessors(chain = true)
@JsonPOJOBuilder(withPrefix = "set")
public static class Builder extends SavedSearch.Builder<SavedSnapshot, Builder> {
private Set<TypedStateToken> stateTokens;
private Long resultCount;
public Builder(final SavedSnapshot snapshot) {
super(snapshot);
stateTokens = snapshot.stateTokens;
resultCount = snapshot.resultCount;
}
@Override
public SavedSnapshot build() {
return new SavedSnapshot(this);
}
}
}