Search in sources :

Example 1 with Part

use of org.springframework.data.repository.query.parser.Part in project ignite by apache.

the class IgniteQueryGenerator method generateSql.

/**
 * @param mtd Method.
 * @param metadata Metadata.
 */
@NotNull
public static IgniteQuery generateSql(Method mtd, RepositoryMetadata metadata) {
    PartTree parts = new PartTree(mtd.getName(), metadata.getDomainType());
    StringBuilder sql = new StringBuilder();
    if (parts.isDelete())
        throw new UnsupportedOperationException("DELETE clause is not supported now.");
    else {
        sql.append("SELECT ");
        if (parts.isDistinct())
            throw new UnsupportedOperationException("DISTINCT clause in not supported.");
        if (parts.isCountProjection())
            sql.append("COUNT(1) ");
        else
            sql.append(" * ");
    }
    sql.append("FROM ").append(metadata.getDomainType().getSimpleName());
    if (parts.iterator().hasNext()) {
        sql.append(" WHERE ");
        for (PartTree.OrPart orPart : parts) {
            sql.append("(");
            for (Part part : orPart) {
                handleQueryPart(sql, part);
                sql.append(" AND ");
            }
            sql.delete(sql.length() - 5, sql.length());
            sql.append(") OR ");
        }
        sql.delete(sql.length() - 4, sql.length());
    }
    addSorting(sql, parts.getSort());
    if (parts.isLimiting()) {
        sql.append(" LIMIT ");
        sql.append(parts.getMaxResults().intValue());
    }
    return new IgniteQuery(sql.toString(), parts.isCountProjection(), getOptions(mtd));
}
Also used : Part(org.springframework.data.repository.query.parser.Part) PartTree(org.springframework.data.repository.query.parser.PartTree) NotNull(org.jetbrains.annotations.NotNull)

Example 2 with Part

use of org.springframework.data.repository.query.parser.Part in project spring-data-mongodb by spring-projects.

the class MongoQueryCreator method from.

/**
 * Populates the given {@link CriteriaDefinition} depending on the {@link Part} given.
 *
 * @param part
 * @param property
 * @param criteria
 * @param parameters
 * @return
 */
private Criteria from(Part part, MongoPersistentProperty property, Criteria criteria, Iterator<Object> parameters) {
    Type type = part.getType();
    switch(type) {
        case AFTER:
        case GREATER_THAN:
            return criteria.gt(parameters.next());
        case GREATER_THAN_EQUAL:
            return criteria.gte(parameters.next());
        case BEFORE:
        case LESS_THAN:
            return criteria.lt(parameters.next());
        case LESS_THAN_EQUAL:
            return criteria.lte(parameters.next());
        case BETWEEN:
            return criteria.gt(parameters.next()).lt(parameters.next());
        case IS_NOT_NULL:
            return criteria.ne(null);
        case IS_NULL:
            return criteria.is(null);
        case NOT_IN:
            return criteria.nin(nextAsArray(parameters));
        case IN:
            return criteria.in(nextAsArray(parameters));
        case LIKE:
        case STARTING_WITH:
        case ENDING_WITH:
        case CONTAINING:
            return createContainingCriteria(part, property, criteria, parameters);
        case NOT_LIKE:
            return createContainingCriteria(part, property, criteria.not(), parameters);
        case NOT_CONTAINING:
            return createContainingCriteria(part, property, criteria.not(), parameters);
        case REGEX:
            return criteria.regex(parameters.next().toString());
        case EXISTS:
            return criteria.exists((Boolean) parameters.next());
        case TRUE:
            return criteria.is(true);
        case FALSE:
            return criteria.is(false);
        case NEAR:
            Range<Distance> range = accessor.getDistanceRange();
            Optional<Distance> distance = range.getUpperBound().getValue();
            Optional<Distance> minDistance = range.getLowerBound().getValue();
            Point point = accessor.getGeoNearLocation();
            Point pointToUse = point == null ? nextAs(parameters, Point.class) : point;
            boolean isSpherical = isSpherical(property);
            return distance.map(it -> {
                if (isSpherical || !Metrics.NEUTRAL.equals(it.getMetric())) {
                    criteria.nearSphere(pointToUse);
                } else {
                    criteria.near(pointToUse);
                }
                criteria.maxDistance(it.getNormalizedValue());
                minDistance.ifPresent(min -> criteria.minDistance(min.getNormalizedValue()));
                return criteria;
            }).orElseGet(() -> isSpherical ? criteria.nearSphere(pointToUse) : criteria.near(pointToUse));
        case WITHIN:
            Object parameter = parameters.next();
            return criteria.within((Shape) parameter);
        case SIMPLE_PROPERTY:
            return isSimpleComparisionPossible(part) ? criteria.is(parameters.next()) : createLikeRegexCriteriaOrThrow(part, property, criteria, parameters, false);
        case NEGATING_SIMPLE_PROPERTY:
            return isSimpleComparisionPossible(part) ? criteria.ne(parameters.next()) : createLikeRegexCriteriaOrThrow(part, property, criteria, parameters, true);
        default:
            throw new IllegalArgumentException("Unsupported keyword!");
    }
}
Also used : MongoRegexCreator(org.springframework.data.mongodb.core.query.MongoRegexCreator) Arrays(java.util.Arrays) MongoPersistentProperty(org.springframework.data.mongodb.core.mapping.MongoPersistentProperty) IgnoreCaseType(org.springframework.data.repository.query.parser.Part.IgnoreCaseType) Metrics(org.springframework.data.geo.Metrics) LoggerFactory(org.slf4j.LoggerFactory) Shape(org.springframework.data.geo.Shape) Type(org.springframework.data.repository.query.parser.Part.Type) MappingContext(org.springframework.data.mapping.context.MappingContext) Part(org.springframework.data.repository.query.parser.Part) Distance(org.springframework.data.geo.Distance) AbstractQueryCreator(org.springframework.data.repository.query.parser.AbstractQueryCreator) Sort(org.springframework.data.domain.Sort) MatchMode(org.springframework.data.mongodb.core.query.MongoRegexCreator.MatchMode) Point(org.springframework.data.geo.Point) Logger(org.slf4j.Logger) ClassUtils(org.springframework.util.ClassUtils) Iterator(java.util.Iterator) GeoSpatialIndexType(org.springframework.data.mongodb.core.index.GeoSpatialIndexType) PotentiallyConvertingIterator(org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor.PotentiallyConvertingIterator) PartTree(org.springframework.data.repository.query.parser.PartTree) Collection(java.util.Collection) Range(org.springframework.data.domain.Range) Criteria(org.springframework.data.mongodb.core.query.Criteria) Query(org.springframework.data.mongodb.core.query.Query) PersistentPropertyPath(org.springframework.data.mapping.context.PersistentPropertyPath) CriteriaDefinition(org.springframework.data.mongodb.core.query.CriteriaDefinition) Optional(java.util.Optional) PropertyPath(org.springframework.data.mapping.PropertyPath) GeoSpatialIndexed(org.springframework.data.mongodb.core.index.GeoSpatialIndexed) Assert(org.springframework.util.Assert) IgnoreCaseType(org.springframework.data.repository.query.parser.Part.IgnoreCaseType) Type(org.springframework.data.repository.query.parser.Part.Type) GeoSpatialIndexType(org.springframework.data.mongodb.core.index.GeoSpatialIndexType) Point(org.springframework.data.geo.Point) Distance(org.springframework.data.geo.Distance)

Example 3 with Part

use of org.springframework.data.repository.query.parser.Part in project spring-data-mongodb by spring-projects.

the class IndexEnsuringQueryCreationListener method onCreation.

/*
	 * (non-Javadoc)
	 * @see org.springframework.data.repository.core.support.QueryCreationListener#onCreation(org.springframework.data.repository.query.RepositoryQuery)
	 */
public void onCreation(PartTreeMongoQuery query) {
    PartTree tree = query.getTree();
    if (!tree.hasPredicate()) {
        return;
    }
    Index index = new Index();
    index.named(query.getQueryMethod().getName());
    Sort sort = tree.getSort();
    for (Part part : tree.getParts()) {
        if (GEOSPATIAL_TYPES.contains(part.getType())) {
            return;
        }
        String property = part.getProperty().toDotPath();
        Direction order = toDirection(sort, property);
        index.on(property, order);
    }
    // Add fixed sorting criteria to index
    if (sort.isSorted()) {
        for (Order order : sort) {
            index.on(order.getProperty(), order.getDirection());
        }
    }
    MongoEntityMetadata<?> metadata = query.getQueryMethod().getEntityInformation();
    indexOperationsProvider.indexOps(metadata.getCollectionName()).ensureIndex(index);
    LOG.debug(String.format("Created %s!", index));
}
Also used : Order(org.springframework.data.domain.Sort.Order) Part(org.springframework.data.repository.query.parser.Part) Sort(org.springframework.data.domain.Sort) Index(org.springframework.data.mongodb.core.index.Index) PartTree(org.springframework.data.repository.query.parser.PartTree) Direction(org.springframework.data.domain.Sort.Direction)

Aggregations

Part (org.springframework.data.repository.query.parser.Part)3 PartTree (org.springframework.data.repository.query.parser.PartTree)3 Sort (org.springframework.data.domain.Sort)2 Arrays (java.util.Arrays)1 Collection (java.util.Collection)1 Iterator (java.util.Iterator)1 Optional (java.util.Optional)1 NotNull (org.jetbrains.annotations.NotNull)1 Logger (org.slf4j.Logger)1 LoggerFactory (org.slf4j.LoggerFactory)1 Range (org.springframework.data.domain.Range)1 Direction (org.springframework.data.domain.Sort.Direction)1 Order (org.springframework.data.domain.Sort.Order)1 Distance (org.springframework.data.geo.Distance)1 Metrics (org.springframework.data.geo.Metrics)1 Point (org.springframework.data.geo.Point)1 Shape (org.springframework.data.geo.Shape)1 PropertyPath (org.springframework.data.mapping.PropertyPath)1 MappingContext (org.springframework.data.mapping.context.MappingContext)1 PersistentPropertyPath (org.springframework.data.mapping.context.PersistentPropertyPath)1