1 package search.db;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.List;
6 import java.util.Set;
7 import java.util.TreeSet;
8
9 import util.ConnectionUtil;
10import util.TableOperations;
11import chemaxon.jchem.db.JChemSearch;
12import chemaxon.sss.SearchConstants;
13import chemaxon.sss.search.JChemSearchOptions;
14import chemaxon.util.ConnectionHandler;
15
16
22public final class MultipleQueriesExample {
23
24 private static final String TABLE_NAME = "demo";
25
26 private static final String[] QUERIES = new String[] { "CCCCC", "O", "N" };
27
28 private ConnectionHandler connHandler;
29
30 public static void main(String[] args) {
31 try {
32 new MultipleQueriesExample().run();
33 } catch (Exception e) {
34 e.printStackTrace();
35 }
36 }
37
38 private void run() throws Exception {
39 connHandler = ConnectionUtil.connectToDB();
40 try {
41 TableOperations.setupMoleculeTable(connHandler, TABLE_NAME);
42 warmupSearch();
43 runNormalQueries();
44 runFilteredQueries();
45 } finally {
46 ConnectionUtil.closeConnection(connHandler);
47 }
48 }
49
50
54 private void runNormalQueries() throws Exception {
55
56 System.out.println("Running normal queries");
57
58 long start = System.currentTimeMillis();
59
60 Set<Integer> results = new TreeSet<Integer>(getSearchHits(QUERIES[0]));
61 results.retainAll(getSearchHits(QUERIES[1]));
62 results.retainAll(getSearchHits(QUERIES[2]));
63
64 System.out.println("Final results:");
65 System.out.println("Elapsed time (in ms): " + (System.currentTimeMillis() - start));
66 listResults(results);
67 }
68
69
73 private void runFilteredQueries() throws Exception {
74
75 System.out.println("Running filtered queries");
76
77 long start = System.currentTimeMillis();
78 Collection<Integer> results = getSearchHits(QUERIES[0]);
79 results = getFilteredSearchHits(QUERIES[1], results);
80 results = getFilteredSearchHits(QUERIES[2], results);
81
82 System.out.println("Final results:");
83 System.out.println("Elapsed time (in ms): " + (System.currentTimeMillis() - start));
84 listResults(results);
85 }
86
87
94 private Collection<Integer> getSearchHits(String query) throws Exception {
95 return getFilteredSearchHits(query, null);
96 }
97
98
01 private void warmupSearch() throws Exception {
02 System.out.println("Warmup search...");
03 getSearchHits("");
04 }
05
06
15 private Collection<Integer> getFilteredSearchHits(String query,
16 Collection<Integer> filterIds) throws Exception {
17
18 JChemSearchOptions searchOpts = new JChemSearchOptions(SearchConstants.SUBSTRUCTURE);
20 JChemSearch jcs = new JChemSearch();
21 jcs.setSearchOptions(searchOpts);
22 jcs.setConnectionHandler(connHandler);
23 jcs.setStructureTable(TABLE_NAME);
24 jcs.setQueryStructure(query);
25 if (filterIds != null) {
26 jcs.setFilterIDList(MultipleQueriesExample.toIntArray(filterIds));
27 }
28
29 jcs.run();
31 int[] results = jcs.getResults();
32 return MultipleQueriesExample.toIntegerList(results);
33 }
34
35 private void listResults(Collection<Integer> results) {
36 System.out.printf("Result count: %d\n", results.size());
37 System.out.printf("Result cd_ids: %s\n", results.toString());
38 System.out.println();
39 }
40
41
44 public static List<Integer> toIntegerList(int[] source) {
45 List<Integer> result = new ArrayList<Integer>(source.length);
46 for (int i : source) {
47 result.add(i);
48 }
49 return result;
50 }
51
52
55 public static int[] toIntArray(Collection<Integer> source) {
56 int[] result = new int[source.size()];
57 int i = 0;
58 for (Integer x : source) {
59 result[i++] = x;
60 }
61 return result;
62 }
63
64}
65