/* * Copyright (C) 2015 thirdy * * This program 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 2 * of the License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package io.jexiletools.es; import java.io.File; import java.util.LinkedList; import java.util.List; import org.apache.commons.io.Charsets; import org.apache.commons.io.FileUtils; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.FilterBuilders; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; import io.jexiletools.es.model.json.ExileToolsHit; import io.searchbox.core.SearchResult; import io.searchbox.core.SearchResult.Hit; /** * @author thirdy * */ public class ExileToolsSearchClientTest { private static final String BLACK_MARKET_API_KEY = "4b1ccf2fce44441365118e9cd7023c38"; private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); static ExileToolsSearchClient client; @BeforeClass public static void setUpBeforeClass() throws Exception { client = new ExileToolsSearchClient("http://api.exiletools.com/index", BLACK_MARKET_API_KEY); } @AfterClass public static void tearDownAfterClass() throws Exception { client.shutdown(); } // TODO: we've excluded most of ES's transitve deps, however this breaks these tests when running with mvn test @Test public void testGrabItemMapping() throws Exception { HttpResponse<String> httpResponse = Unirest.get("http://api.exiletools.com/index/_mapping") .header("Authorization", "DEVELOPMENT-Indexer") .asString(); String body = httpResponse.getBody(); File mapping = new File("poe-mapping.json"); FileUtils.writeStringToFile(mapping, body, Charsets.UTF_8); } @Test @Ignore public void testQuery() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); FilterBuilder filter = FilterBuilders.boolFilter() .must(FilterBuilders.termFilter("attributes.league", "Flashback Event HC (IC002)")) .must(FilterBuilders.termFilter("attributes.equipType", "Jewel")) .must(FilterBuilders.rangeFilter("modsTotal.#% increased maximum Life").gt(4)) .must(FilterBuilders.termFilter("shop.verified", "yes")) // .must(FilterBuilders.termFilter("attributes.rarity", "Magic")) ; searchSourceBuilder .query(QueryBuilders.filteredQuery(QueryBuilders.boolQuery().minimumNumberShouldMatch(2) .should(QueryBuilders.rangeQuery("modsTotal.#% increased Area Damage")) .should(QueryBuilders.rangeQuery("modsTotal.#% increased Projectile Damage")) .should(QueryBuilders.rangeQuery("modsTotal.#% increased Chaos Damage")), filter)) .sort("_score"); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); List<Hit<ExileToolsHit, Void>> hits = result.getHits(ExileToolsHit.class); hits.stream().map(hit -> hit.source).forEach(System.out::println); } /** * As per ES documentation/tome, the best way to do our search is via Filters */ @Test @Ignore public void testExecuteMjolnerUsingFilters() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); List<FilterBuilder> filters = new LinkedList<>(); filters.add(FilterBuilders.termFilter("attributes.league", "Flashback Event (IC001)")); // filters.add(FilterBuilders.termFilter("info.name", "Mjolner")); filters.add(FilterBuilders.termFilter("info.name", "Hegemony's Era")); filters.add(FilterBuilders.rangeFilter("properties.Weapon.Physical DPS").from(400)); FilterBuilder filter = FilterBuilders.andFilter(filters.toArray(new FilterBuilder[filters.size()])); searchSourceBuilder.query(QueryBuilders.filteredQuery(null, filter)); searchSourceBuilder.size(100); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); List<Hit<ExileToolsHit, Void>> hits = result.getHits(ExileToolsHit.class); for (Hit<ExileToolsHit, Void> hit : hits) { // logger.info(hit.source.toString()); // hit.source.getQuality().ifPresent( q -> logger.info(q.toString()) ); hit.source.getPhysicalDPS().ifPresent( q -> logger.info(q.toString()) ); // logger.info(hit.source.toString()); // logger.info(hit.source.getRequirements().getLevel().toString()); // logger.info(hit.source.getExplicitMods().toString()); } } @Test @Ignore public void testDistinctCurrencyIconValues() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.aggregation(AggregationBuilders.terms("rarities").field("shop.verified") .size(0)); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); logger.info(result.getJsonString()); System.out.println("-------"); result.getAggregations().getTermsAggregation("rarities").getBuckets().stream() .map(e -> e.getKey()) .sorted() .filter(k -> k.contains("Currency")) .forEach(k -> System.out.println(k)); } @Test @Ignore public void testDistinctItemTypeValues() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.filtered(null, FilterBuilders.boolFilter() .must(FilterBuilders.termFilter("attributes.itemType", "Card")) )); searchSourceBuilder.aggregation(AggregationBuilders.terms("rarities").field("info.name") .size(0)); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); logger.info(result.getJsonString()); System.out.println("-------"); result.getAggregations().getTermsAggregation("rarities").getBuckets().stream() .map(e -> e.getKey()) .sorted() .forEach(k -> System.out.println(k)); } @Test @Ignore public void testExecuteMjolner() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("info.name", "Mjolner")); searchSourceBuilder.size(1); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); List<Hit<ExileToolsHit, Void>> hits = result.getHits(ExileToolsHit.class); for (Hit<ExileToolsHit, Void> hit : hits) { logger.info(hit.source.toString()); } } @Test @Ignore public void testExecuteTabula() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("info.name", "Tabula Rasa")); searchSourceBuilder.size(1); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); List<Hit<ExileToolsHit, Void>> hits = result.getHits(ExileToolsHit.class); for (Hit<ExileToolsHit, Void> hit : hits) { logger.info(hit.source.toString()); } } @Test @Ignore public void testShops() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("attributes.league", "Flashback Event (IC001)")) .mustNot(QueryBuilders.matchQuery("attributes.league", "Flashback Event (IC001)") )); searchSourceBuilder.size(1); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); List<Hit<ExileToolsHit, Void>> hits = result.getHits(ExileToolsHit.class); for (Hit<ExileToolsHit, Void> hit : hits) { logger.info(hit.source.toString()); } } @Test @Ignore public void testGetLeagues() throws Exception { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.aggregation(AggregationBuilders .terms("leagues") .field("attributes.league")); // searchSourceBuilder.size(0); SearchResult result = client.execute(searchSourceBuilder.toString()).getSearchResult(); List<Hit<ExileToolsHit, Void>> hits = result.getHits(ExileToolsHit.class); for (Hit<ExileToolsHit, Void> hit : hits) { logger.info(hit.source.toString()); } } }