|
|
/*
|
|
|
This file is part of Airsonic.
|
|
|
|
|
|
Airsonic is free software: you can redistribute it and/or modify
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
(at your option) any later version.
|
|
|
|
|
|
Airsonic is distributed in the hope that it will be useful,
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
along with Airsonic. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
Copyright 2016 (C) Airsonic Authors
|
|
|
Based upon Subsonic, Copyright 2009 (C) Sindre Mehus
|
|
|
*/
|
|
|
|
|
|
package org.airsonic.player.service.search;
|
|
|
|
|
|
import java.util.AbstractMap;
|
|
|
import java.util.AbstractMap.SimpleEntry;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* Enum that symbolizes the each lucene index entity.
|
|
|
* This class is a division of what was once part of SearchService and added functionality.
|
|
|
* @since legacy
|
|
|
*/
|
|
|
public enum IndexType {
|
|
|
|
|
|
SONG(
|
|
|
fieldNames(
|
|
|
FieldNames.TITLE,
|
|
|
FieldNames.ARTIST),
|
|
|
boosts(
|
|
|
entry(FieldNames.TITLE, 1.1F))),
|
|
|
|
|
|
ALBUM(
|
|
|
fieldNames(
|
|
|
FieldNames.ALBUM,
|
|
|
FieldNames.ARTIST),
|
|
|
// FieldNames.FOLDER), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
|
|
boosts(
|
|
|
entry(FieldNames.ALBUM, 1.1F))),
|
|
|
|
|
|
ALBUM_ID3(
|
|
|
fieldNames(
|
|
|
FieldNames.ALBUM,
|
|
|
FieldNames.ARTIST),
|
|
|
// FieldNames.FOLDER_ID), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
|
|
boosts(
|
|
|
entry(FieldNames.ALBUM, 1.1F))),
|
|
|
|
|
|
ARTIST(
|
|
|
fieldNames(
|
|
|
FieldNames.ARTIST),
|
|
|
// FieldNames.FOLDER), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
|
|
boosts()),
|
|
|
|
|
|
ARTIST_ID3(
|
|
|
fieldNames(
|
|
|
FieldNames.ARTIST),
|
|
|
boosts()),
|
|
|
|
|
|
;
|
|
|
|
|
|
/**
|
|
|
* Define the field's applied boost value when searching IndexType.
|
|
|
*
|
|
|
* @param entry {@link #entry(String, float)}.
|
|
|
* When specifying multiple values, enumerate entries.
|
|
|
* @return Map of boost values to be applied to the field
|
|
|
*/
|
|
|
@SafeVarargs
|
|
|
private static final Map<String, Float> boosts(SimpleEntry<String, Float>... entry) {
|
|
|
Map<String, Float> m = new HashMap<>();
|
|
|
Arrays.stream(entry).forEach(kv -> m.put(kv.getKey(), kv.getValue()));
|
|
|
return Collections.unmodifiableMap(m);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Create an entry representing the boost value for the field.
|
|
|
*
|
|
|
* @param k Field name defined by FieldNames
|
|
|
* @param v Boost value
|
|
|
*/
|
|
|
private static final SimpleEntry<String, Float> entry(String k, float v) {
|
|
|
return new AbstractMap.SimpleEntry<>(k, v);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Defines the field that the input value is to search for
|
|
|
* when searching IndexType.
|
|
|
* If you specify multiple values, list the field names.
|
|
|
*/
|
|
|
private static final String[] fieldNames(String... names) {
|
|
|
return Arrays.stream(names).toArray(String[]::new);
|
|
|
}
|
|
|
|
|
|
private final Map<String, Float> boosts;
|
|
|
|
|
|
private final String[] fields;
|
|
|
|
|
|
private IndexType(String[] fieldNames, Map<String, Float> boosts) {
|
|
|
this.fields = fieldNames;
|
|
|
this.boosts = boosts;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns a map of fields and boost values.
|
|
|
*
|
|
|
* @return Map of fields and boost values
|
|
|
* @since legacy
|
|
|
* @see org.apache.lucene.search.BoostQuery
|
|
|
*/
|
|
|
public Map<String, Float> getBoosts() {
|
|
|
return boosts;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Return some of the fields defined in the index.
|
|
|
*
|
|
|
* @return Fields mainly used in multi-field search
|
|
|
* @since legacy
|
|
|
*/
|
|
|
public String[] getFields() {
|
|
|
return fields;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|