/*
* Copyright (C) 2014 Indeed Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.indeed.flamdex.writer;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.longs.LongList;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author jsgroth
*/
public final class FlamdexDocument {
@Nonnull
private final Map<String, LongList> intFields;
@Nonnull
private final Map<String, List<String>> stringFields;
public FlamdexDocument() {
this(new HashMap<String, LongList>(), new HashMap<String, List<String>>());
}
public FlamdexDocument(@Nonnull final Map<String, LongList> intFields, @Nonnull final Map<String, List<String>> stringFields) {
this.intFields = intFields;
this.stringFields = stringFields;
}
@Nonnull
public Map<String, LongList> getIntFields() {
return intFields;
}
@Nonnull
public Map<String, List<String>> getStringFields() {
return stringFields;
}
public void clearIntField(@Nonnull final String field) {
intFields.remove(field);
}
public void clearStringField(@Nonnull final String field) {
stringFields.remove(field);
}
/**
* Returns a list of the int terms for a given field.
* If this field hasn't been added, null is returned.
*/
@Nullable
public LongList getIntTerms(@Nonnull final String field) {
return intFields.get(field);
}
/**
* Returns a list of the string terms for a given field.
* If this field hasn't been added, null is returned.
*/
@Nullable
public List<String> getStringTerms(@Nonnull final String field) {
return stringFields.get(field);
}
// Integer Field Setters
private LongList prepareIntField(final String field) {
Preconditions.checkNotNull(field, "field cannot be null");
LongList list = intFields.get(field);
if (list == null) {
list = new LongArrayList();
intFields.put(field, list);
}
return list;
}
public void setIntField(@Nonnull final String field, @Nonnull final long[] terms) {
clearIntField(field);
addIntTerms(field, terms);
}
public void addIntTerms(@Nonnull final String field, @Nonnull final long[] terms) {
final LongList list = prepareIntField(field);
Preconditions.checkNotNull(terms, "terms list cannot be null");
for (long term : terms) {
list.add(term);
}
}
public void setIntField(@Nonnull final String field, final long term) {
clearIntField(field);
addIntTerm(field, term);
}
public void addIntTerm(@Nonnull final String field, final long term) {
prepareIntField(field).add(term);
}
public void setIntField(@Nonnull final String field, final boolean b) {
clearIntField(field);
addIntTerm(field, b);
}
public void addIntTerm(@Nonnull final String field, final boolean b) {
prepareIntField(field).add(b ? 1 : 0);
}
public void setIntField(@Nonnull final String field, @Nonnull final Iterable<Long> terms) {
clearIntField(field);
addIntTerms(field, terms);
}
public void addIntTerms(@Nonnull final String field, @Nonnull final Iterable<Long> terms) {
final LongList list = prepareIntField(field);
Preconditions.checkNotNull(terms, "terms list cannot be null");
for (Long term : terms) {
Preconditions.checkNotNull(term, "null terms not allowed");
list.add(term);
}
}
// String Field Setters
private List<String> prepareStringField(final String field) {
Preconditions.checkNotNull(field, "field cannot be null");
List<String> list = stringFields.get(field);
if (list == null) {
list = new ArrayList<>();
stringFields.put(field, list);
}
return list;
}
public void setStringField(@Nonnull final String field, @Nonnull final CharSequence term) {
clearStringField(field);
addStringTerm(field, term);
}
public void addStringTerm(@Nonnull final String field, @Nonnull final CharSequence term) {
Preconditions.checkNotNull(term, "term cannot be null");
prepareStringField(field).add(term.toString());
}
public void setStringField(@Nonnull final String field, @Nonnull final Iterable<? extends CharSequence> terms) {
clearStringField(field);
addStringTerms(field, terms);
}
public void addStringTerms(@Nonnull final String field, @Nonnull final Iterable<? extends CharSequence> terms) {
final List<String> list = prepareStringField(field);
Preconditions.checkNotNull(terms, "terms list cannot be null");
for (CharSequence term : terms) {
Preconditions.checkNotNull(term, "null terms not allowed");
list.add(term.toString());
}
}
public void setStringField(@Nonnull final String field, @Nonnull final CharSequence[] terms) {
clearStringField(field);
addStringTerms(field, terms);
}
public void addStringTerms(@Nonnull final String field, @Nonnull final CharSequence[] terms) {
final List<String> list = prepareStringField(field);
Preconditions.checkNotNull(terms, "terms list cannot be null");
for (CharSequence term : terms) {
Preconditions.checkNotNull(term, "null terms not allowed");
list.add(term.toString());
}
}
public FlamdexDocument copy() {
final Map<String, LongList> intFieldsCopy = new HashMap<>(2*intFields.size());
for (final Map.Entry<String, LongList> e : intFields.entrySet()) {
intFieldsCopy.put(e.getKey(), new LongArrayList(e.getValue()));
}
final Map<String, List<String>> stringFieldsCopy = new HashMap<>(2*stringFields.size());
for (final Map.Entry<String, List<String>> e : stringFields.entrySet()) {
stringFieldsCopy.put(e.getKey(), Lists.newArrayList(e.getValue()));
}
return new FlamdexDocument(intFieldsCopy, stringFieldsCopy);
}
}