Git Repositories

Initial
[xerox-elastic-poc.git] / src / main / java / com / viseo / xerox / elastic / Main.java
1 package com.viseo.xerox.elastic;
2
3 import org.apache.commons.io.IOUtils;
4 import org.hibernate.Session;
5 import org.hibernate.Transaction;
6
7 import javax.persistence.EntityManager;
8 import java.io.IOException;
9 import java.net.URISyntaxException;
10 import java.nio.charset.StandardCharsets;
11 import java.util.List;
12 import java.util.Scanner;
13
14 public class Main {
15
16     private final EntityManager em;
17     private final ESJsonConfig esJsonConfig;
18
19     public static void main(String[] args) {
20         try {
21             final String action;
22             if (args.length > 0) {
23                 action = args[0];
24             } else {
25                 action = "";
26             }
27             new Main().run(action);
28         } catch (Exception e) {
29             e.printStackTrace();
30         } finally {
31             EntityManagerProvider.getInstance().getEmf().close();
32         }
33     }
34
35     private Main() {
36         em = EntityManagerProvider.getInstance().getEm();
37         esJsonConfig = new ESJsonConfig();
38     }
39
40     private void run(String action) throws Exception {
41         switch (action) {
42             case "create":
43                 createDb();
44                 break;
45             case "index":
46                 indexDb();
47                 break;
48             default:
49                 queryDb();
50         }
51     }
52
53     private void createDb() throws IOException {
54         String sql = IOUtils.toString(getClass().getResourceAsStream("/insert_data.sql"), StandardCharsets.UTF_8.name());
55         Session session = ((Session) em.getDelegate()).getSession();
56         Transaction tx = session.beginTransaction();
57         session.createNativeQuery(sql).executeUpdate();
58         tx.commit();
59         session.close();
60     }
61
62     private void indexDb() throws IOException {
63         ESRequest esRequest = new ESRequest(ESJsonConfig.ES_BASE_URL);
64         dropIndex(esRequest);
65         createIndexAndAnalyzer(esRequest);
66         paramMappings(esRequest, InterrestPoint.class, MobilityPoint.class);
67         for (InterrestPoint point : em.createQuery("select p from InterrestPoint p", InterrestPoint.class).getResultList()) {
68             indexPoint(esRequest, point);
69         }
70         for (MobilityPoint point : em.createQuery("select p from MobilityPoint p", MobilityPoint.class).getResultList()) {
71             indexPoint(esRequest, point);
72         }
73     }
74
75     private void dropIndex(ESRequest esRequest) throws IOException {
76         esRequest.dropIndex(ESJsonConfig.INDEX_NAME);
77     }
78
79     private void createIndexAndAnalyzer(ESRequest esRequest) throws IOException {
80         esRequest.createIndex(esJsonConfig.getJsonIndex(), ESJsonConfig.INDEX_NAME);
81     }
82
83     @SafeVarargs
84     private final void paramMappings(ESRequest esRequest, Class<? extends Point>... classes) throws IOException {
85         for (Class<? extends Point> aClass : classes) {
86             esRequest.paramMapping(esJsonConfig.getJsonForMapping(), ESJsonConfig.INDEX_NAME, aClass.getSimpleName());
87         }
88     }
89
90     private void indexPoint(ESRequest esRequest, Point point) throws IOException {
91         esRequest.index(esJsonConfig.getJsonForIndexing(point), ESJsonConfig.INDEX_NAME, point.getClass().getSimpleName(), point.getId());
92     }
93
94     /**
95      * @see <a href="https://www.elastic.co/guide/en/elasticsearch/guide/2.x/asciifolding-token-filter.html">ascii folding</a>
96      */
97     private void queryDb() throws IOException, URISyntaxException {
98         try (Scanner scanner = new Scanner(System.in, "UTF-8")) {
99             System.out.print("Latitude: ");
100             final double latitude = scanner.nextDouble();
101             System.out.print("Longitude: ");
102             final double longitude = scanner.nextDouble();
103             scanner.nextLine();
104             String queryString = "-";
105             while (!queryString.isEmpty()) {
106                 System.out.print("Query: ");
107                 queryString = scanner.nextLine();
108                 List<Point> points = queryES(queryString, latitude, longitude);
109                 getAndPrintPoints(points);
110             }
111         }
112     }
113
114     private List<Point> queryES(String queryString, double latitude, double longitude) throws IOException, URISyntaxException {
115         String jsonRequest = esJsonConfig.getJsonQuery(queryString, latitude, longitude);
116         ESRequest esRequest = new ESRequest(ESJsonConfig.ES_BASE_URL);
117         String jsonResult = esRequest.find(jsonRequest, ESJsonConfig.INDEX_NAME, queryString);
118         return esJsonConfig.parseJsonResult(jsonResult);
119     }
120
121     private void getAndPrintPoints(List<Point> points) {
122         for (Point point : points) {
123             Class<? extends Point> pointClass = point.getClass();
124             Double distanceKm = point.getDistanceKm();
125             point = em.createQuery(String.format("select p from %s p where p.id = :id", pointClass.getSimpleName()), pointClass).setParameter("id", point.getId()).getSingleResult();
126             point.setDistanceKm(distanceKm);
127             System.out.println(point);
128         }
129     }
130 }