generated from Nekojimi/JavaMavenTemplate
Searcher: load abbreviated name from YAML, and add functions to sort results by similarity.
This commit is contained in:
parent
7e41eb1105
commit
b10f9d3573
|
@ -6,7 +6,10 @@
|
||||||
package moe.nekojimi.musicsearcher.providers;
|
package moe.nekojimi.musicsearcher.providers;
|
||||||
|
|
||||||
import com.amihaiemil.eoyaml.YamlMapping;
|
import com.amihaiemil.eoyaml.YamlMapping;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ForkJoinPool;
|
import java.util.concurrent.ForkJoinPool;
|
||||||
|
@ -15,62 +18,97 @@ import java.util.concurrent.TimeoutException;
|
||||||
import moe.nekojimi.musicsearcher.Query;
|
import moe.nekojimi.musicsearcher.Query;
|
||||||
import moe.nekojimi.musicsearcher.QueryFieldUnsupportedException;
|
import moe.nekojimi.musicsearcher.QueryFieldUnsupportedException;
|
||||||
import moe.nekojimi.musicsearcher.Result;
|
import moe.nekojimi.musicsearcher.Result;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author jim
|
* @author jim
|
||||||
*/
|
*/
|
||||||
public abstract class Searcher
|
public abstract class Searcher
|
||||||
{
|
{
|
||||||
final String name;
|
protected final String name;
|
||||||
|
protected String abbr;
|
||||||
private final ForkJoinPool executor;
|
private final ForkJoinPool executor;
|
||||||
|
|
||||||
public Searcher(String name)
|
public Searcher(String name)
|
||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
this.abbr = name.substring(0, 2);
|
||||||
this.executor = new ForkJoinPool();
|
this.executor = new ForkJoinPool();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Searcher(YamlMapping yaml)
|
public Searcher(YamlMapping yaml)
|
||||||
{
|
{
|
||||||
this(yaml.string("name"));
|
this(yaml.string("name"));
|
||||||
|
abbr = yaml.string("abbr");
|
||||||
assert yaml.string("type").equals(this.getClass().getSimpleName());
|
assert yaml.string("type").equals(this.getClass().getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName()
|
public String getName()
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Result> searchAndWait(Query query) throws InterruptedException, ExecutionException
|
public List<Result> searchAndWait(Query query) throws InterruptedException, ExecutionException
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return searchAndWait(query, Long.MAX_VALUE, TimeUnit.DAYS);
|
return searchAndWait(query, Long.MAX_VALUE, TimeUnit.DAYS);
|
||||||
} catch (TimeoutException ex)
|
} catch (TimeoutException ex)
|
||||||
{
|
{
|
||||||
throw new RuntimeException("This should never happen!",ex);
|
throw new RuntimeException("This should never happen!",ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Result> searchAndWait(Query query, long limit, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
|
public List<Result> searchAndWait(Query query, long limit, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
|
||||||
{
|
{
|
||||||
return search(query).get(limit, unit);
|
return search(query).get(limit, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompletableFuture<List<Result>> search(Query query)
|
public CompletableFuture<List<Result>> search(Query query)
|
||||||
{
|
{
|
||||||
CompletableFuture<List<Result>> future = new CompletableFuture<>();
|
CompletableFuture<List<Result>> future = new CompletableFuture<>();
|
||||||
future.completeAsync(()->doSearch(query), executor);
|
future.completeAsync(() -> searchWrapper(query), executor);
|
||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected List<Result> searchWrapper(Query query)
|
||||||
|
{
|
||||||
|
List<Result> results = doSearch(query);
|
||||||
|
|
||||||
|
for (Result result : results)
|
||||||
|
{
|
||||||
|
double artistScore = 1;
|
||||||
|
double titleScore = 1;
|
||||||
|
double albumScore = 1;
|
||||||
|
double fullTextScore = 0;
|
||||||
|
|
||||||
|
Set<String> toCompare = new HashSet<>();
|
||||||
|
toCompare.add(result.getAlbum());
|
||||||
|
toCompare.add(result.getArtist());
|
||||||
|
toCompare.add(result.getTitle());
|
||||||
|
|
||||||
|
for (String comparison : toCompare)
|
||||||
|
{
|
||||||
|
if (comparison == null)
|
||||||
|
continue;
|
||||||
|
double score = StringUtils.getJaroWinklerDistance(query.getTextSearch(), comparison);
|
||||||
|
if (score > fullTextScore)
|
||||||
|
fullTextScore = score;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.setScore(albumScore * artistScore * titleScore * fullTextScore);
|
||||||
|
}
|
||||||
|
Collections.sort(results, Collections.reverseOrder());
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract List<Result> doSearch(Query query) throws QueryFieldUnsupportedException;
|
protected abstract List<Result> doSearch(Query query) throws QueryFieldUnsupportedException;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.getClass().getSimpleName() + "{" + "name=" + name + '}';
|
return this.getClass().getSimpleName() + "{" + "name=" + name + '}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue