/adapters/mongodb/src/main/java/org/atomhopper/mongodb/query/SimpleCategoryCriteriaGenerator.java

https://github.com/rackerlabs/atom-hopper · Java · 88 lines · 69 code · 19 blank · 0 comment · 15 complexity · 24371f03b3c013fc9a9848bda1825c58 MD5 · raw file

  1. package org.atomhopper.mongodb.query;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import org.springframework.data.mongodb.core.query.Criteria;
  5. import org.springframework.data.mongodb.core.query.Query;
  6. public class SimpleCategoryCriteriaGenerator implements CategoryCriteriaGenerator {
  7. private static final char INCLUSIVE_OPERATOR = '+', ESCAPE_OPERATOR = '\\';
  8. private static final char[] OPERATORS = {INCLUSIVE_OPERATOR, ESCAPE_OPERATOR};
  9. private final List<String> inclusionTerms;
  10. private boolean hasTerms;
  11. public SimpleCategoryCriteriaGenerator(String searchString) {
  12. this(searchString, new LinkedList<String>());
  13. }
  14. SimpleCategoryCriteriaGenerator(String searchString, List<String> inclusionTerms) {
  15. this.inclusionTerms = inclusionTerms;
  16. this.hasTerms = false;
  17. if (searchString.trim().length() <= 1) {
  18. return;
  19. }
  20. parse(searchString.trim().toLowerCase());
  21. }
  22. private void parse(String searchString) {
  23. for (int charIndex = 0; charIndex < searchString.length(); charIndex++) {
  24. final char nextOperator = searchString.charAt(charIndex);
  25. final StringBuilder searchTermBuilder = new StringBuilder();
  26. charIndex = readTerm(searchString, searchTermBuilder, charIndex + 1);
  27. switch (nextOperator) {
  28. case INCLUSIVE_OPERATOR:
  29. hasTerms = true;
  30. inclusionTerms.add(searchTermBuilder.toString());
  31. break;
  32. default:
  33. break;
  34. }
  35. }
  36. }
  37. @Override
  38. public void enhanceCriteria(Query ongoingQuery) {
  39. if (hasTerms && !(inclusionTerms.isEmpty())) {
  40. ongoingQuery.addCriteria(Criteria.where("categories.term").in(inclusionTerms));
  41. }
  42. }
  43. private static int readTerm(String searchString, StringBuilder builder, int currentCharIndex) {
  44. int charIndex = currentCharIndex;
  45. boolean isEscaped = false;
  46. do {
  47. final char nextChar = searchString.charAt(charIndex);
  48. if (isEscaped || !isOperator(nextChar)) {
  49. builder.append(nextChar);
  50. isEscaped = false;
  51. } else {
  52. if (nextChar == ESCAPE_OPERATOR) {
  53. isEscaped = true;
  54. } else {
  55. return charIndex - 1;
  56. }
  57. }
  58. } while (++charIndex < searchString.length());
  59. return charIndex;
  60. }
  61. private static boolean isOperator(char character) {
  62. for (char operator : OPERATORS) {
  63. if (operator == character) {
  64. return true;
  65. }
  66. }
  67. return false;
  68. }
  69. }