@Test
  public void testCreateQueryWithLikeNotClause() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByTitleNotLike", String.class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {"j73x73r"});
    Assert.assertEquals("-title:j73x73r*", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithLessThanClause() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByPriceLessThan", Float.class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {100f});
    Assert.assertEquals("price:[* TO 100.0}", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithFalseClause() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByAvailableFalse");

    Query query = createQueryForMethodWithArgs(method, new Object[] {});
    Assert.assertEquals("inStock:false", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithNotInClause() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByPopularityNotIn", Integer[].class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {new Object[] {1, 2, 3}});
    Assert.assertEquals("-popularity:(1 2 3)", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateFindBySingleCriteria() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByPopularity", Integer.class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {100});
    Assert.assertEquals("popularity:100", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateFindByNullCriteria() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByPopularityIsNull");

    Query query = createQueryForMethodWithArgs(method, new Object[] {});
    Assert.assertEquals("-popularity:[* TO *]", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithRegexClause() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByTitleRegex", String.class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {"(\\+ \\*)"});
    Assert.assertEquals("title:(\\+ \\*)", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithArrayType() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByPopularityLike", String[].class);

    Query query =
        createQueryForMethodWithArgs(method, new Object[] {new String[] {"one", "two", "three"}});
    Assert.assertEquals("popularity:(one* two* three*)", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithBetweenClause() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByPopularityBetween", Integer.class, Integer.class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {100, 200});
    Assert.assertEquals("popularity:[100 TO 200]", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateFindByAndQuery() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByPopularityAndPrice", Integer.class, Float.class);

    Query query = createQueryForMethodWithArgs(method, new Object[] {100, 200f});
    Assert.assertEquals("popularity:100 AND price:200.0", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithContainingClauseUsingCollection()
      throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByTitleContaining", Collection.class);

    Query query =
        createQueryForMethodWithArgs(method, new Object[] {Arrays.asList("one", "two", "three")});
    Assert.assertEquals("title:(*one* *two* *three*)", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithAfterClause() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByLastModifiedAfter", Date.class);

    Query query =
        createQueryForMethodWithArgs(
            method, new Object[] {new DateTime(2012, 10, 15, 5, 31, 0, DateTimeZone.UTC)});
    Assert.assertEquals(
        "last_modified:{2012\\-10\\-15T05\\:31\\:00.000Z TO *]", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithWithin() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByLocationWithin", Point.class, Distance.class);

    Query query =
        createQueryForMethodWithArgs(
            method, new Object[] {new Point(48.303056, 14.290556), new Distance(5)});
    Assert.assertEquals(
        "{!geofilt pt=48.303056,14.290556 sfield=store d=5.0}", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithNearWhereUnitIsMiles()
      throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByLocationNear", Point.class, Distance.class);

    Query query =
        createQueryForMethodWithArgs(
            method, new Object[] {new Point(48.303056, 14.290556), new Distance(1, Metrics.MILES)});
    Assert.assertEquals(
        "{!bbox pt=48.303056,14.290556 sfield=store d=1.609344}",
        queryParser.getQueryString(query));
  }
  @Test
  public void testQueryCreationSingleProperty() throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByText", String.class);
    SolrQueryMethod queryMethod =
        new SolrQueryMethod(method, metadataMock, entityInformationCreatorMock);

    StringBasedSolrQuery solrQuery = new StringBasedSolrQuery(queryMethod, solrOperationsMock);

    org.springframework.data.solr.core.query.Query query =
        solrQuery.createQuery(
            new SolrParametersParameterAccessor(queryMethod, new Object[] {"j73x73r"}));

    Assert.assertEquals("textGeneral:j73x73r", queryParser.getQueryString(query));
  }
  @Test
  public void testCreateQueryWithNearUsingBoundingBox()
      throws NoSuchMethodException, SecurityException {
    Method method = SampleRepository.class.getMethod("findByLocationNear", Box.class);

    Query query =
        createQueryForMethodWithArgs(
            method,
            new Object[] {
              new Box(new Point(48.303056, 14.290556), new Point(48.306377, 14.283128))
            });
    Assert.assertEquals(
        "store:[48.303056,14.290556 TO 48.306377,14.283128]", queryParser.getQueryString(query));
  }
  @Test
  public void testQueryCreationMultiyProperty() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByPopularityAndPrice", Integer.class, Float.class);
    SolrQueryMethod queryMethod =
        new SolrQueryMethod(method, metadataMock, entityInformationCreatorMock);

    StringBasedSolrQuery solrQuery = new StringBasedSolrQuery(queryMethod, solrOperationsMock);

    org.springframework.data.solr.core.query.Query query =
        solrQuery.createQuery(
            new SolrParametersParameterAccessor(
                queryMethod, new Object[] {Integer.valueOf(1), Float.valueOf(2f)}));

    Assert.assertEquals("popularity:1 AND price:2.0", queryParser.getQueryString(query));
  }
  @Test
  public void testWithPointProperty() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByLocationNear", Point.class, Distance.class);
    SolrQueryMethod queryMethod =
        new SolrQueryMethod(method, metadataMock, entityInformationCreatorMock);

    StringBasedSolrQuery solrQuery = new StringBasedSolrQuery(queryMethod, solrOperationsMock);

    org.springframework.data.solr.core.query.Query query =
        solrQuery.createQuery(
            new SolrParametersParameterAccessor(
                queryMethod, new Object[] {new Point(48.303056, 14.290556), new Distance(5)}));

    Assert.assertEquals(
        "{!geofilt pt=48.303056,14.290556 sfield=store d=5.0}", queryParser.getQueryString(query));
  }
  @Test
  public void testWithSort() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByNameWithSort", String.class, Sort.class);
    SolrQueryMethod queryMethod =
        new SolrQueryMethod(method, metadataMock, entityInformationCreatorMock);

    StringBasedSolrQuery solrQuery = new StringBasedSolrQuery(queryMethod, solrOperationsMock);
    Sort sort = new Sort(Direction.DESC, "popularity", "price");

    org.springframework.data.solr.core.query.Query query =
        solrQuery.createQuery(
            new SolrParametersParameterAccessor(queryMethod, new Object[] {"spring", sort}));

    Assert.assertEquals("name:spring", queryParser.getQueryString(query));
    Assert.assertEquals(sort, query.getSort());
  }
  @Test
  public void testWithProjectionOnSingleField() throws NoSuchMethodException, SecurityException {
    Method method =
        SampleRepository.class.getMethod("findByNameProjectionOnPopularity", String.class);
    SolrQueryMethod queryMethod =
        new SolrQueryMethod(method, metadataMock, entityInformationCreatorMock);

    StringBasedSolrQuery solrQuery = new StringBasedSolrQuery(queryMethod, solrOperationsMock);

    org.springframework.data.solr.core.query.Query query =
        solrQuery.createQuery(
            new SolrParametersParameterAccessor(queryMethod, new Object[] {"christoph"}));

    Assert.assertEquals("name:christoph*", queryParser.getQueryString(query));
    Assert.assertEquals(1, query.getProjectionOnFields().size());
    Assert.assertEquals("popularity", query.getProjectionOnFields().get(0).getName());
  }
  /** @see DATASOLR-139 */
  @Test
  public void testCombinationsOfOrAndShouldBeCreatedCorrectly()
      throws NoSuchMethodException, SecurityException {

    Method method =
        SampleRepository.class.getMethod(
            "findByNameOrDescriptionAndLastModifiedAfter", String.class, String.class, Date.class);

    Query query =
        createQueryForMethodWithArgs(
            method,
            new Object[] {
              "mail", "domain", new DateTime(2012, 10, 15, 5, 31, 0, DateTimeZone.UTC)
            });
    Assert.assertEquals(
        "name:mail OR description:domain AND last_modified:{2012\\-10\\-15T05\\:31\\:00.000Z TO *]",
        queryParser.getQueryString(query));
  }