io.jexiletools.es.ExileToolsSearchClientTest.java Source code

Java tutorial

Introduction

Here is the source code for io.jexiletools.es.ExileToolsSearchClientTest.java

Source

/*
 * 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());
        }
    }

}