All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mysema.rdfbean.object.ExampleQuery Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2010 Mysema Ltd.
 * All rights reserved.
 * 
 */
package com.mysema.rdfbean.object;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.Nullable;

import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;

import com.mysema.commons.lang.Assert;
import com.mysema.query.BooleanBuilder;
import com.mysema.query.types.Expression;
import com.mysema.query.types.ExpressionUtils;
import com.mysema.query.types.path.PathBuilder;
import com.mysema.query.types.path.PathBuilderFactory;
import com.mysema.rdfbean.model.BID;
import com.mysema.util.BeanMap;

/**
 * ExampleQuery provides support query by example queries
 * 
 * @author tiwe
 * @version $Id$
 */
public class ExampleQuery {

    private static final PathBuilderFactory pathBuilderFactory = new PathBuilderFactory();

    private static final Set> DATE_TIME_TYPES = new HashSet>(Arrays.> asList(
            LocalDate.class,
            LocalTime.class,
            DateTime.class,
            java.util.Date.class,
            java.sql.Date.class,
            java.sql.Time.class,
            java.sql.Timestamp.class
            ));

    private final Session session;

    private final PathBuilder entityPath;

    private final BooleanBuilder conditions;

    /**
     * Create a new Query-by-example query
     * 
     * @param session
     * @param entity
     */
    @SuppressWarnings("unchecked")
    public ExampleQuery(Configuration configuration, Session session, T entity) {
        this.session = Assert.notNull(session, "session");
        this.entityPath = (PathBuilder) pathBuilderFactory.create(entity.getClass());
        this.conditions = new BooleanBuilder();
        BeanMap beanMap = new BeanMap(entity);
        MappedClass mappedClass = configuration.getMappedClass(entity.getClass());
        for (MappedPath mappedPath : mappedClass.getProperties()) {
            MappedProperty property = mappedPath.getMappedProperty();
            Object value = property.getValue(beanMap);
            if (value != null
                    // date/time values are skipped
                    && !DATE_TIME_TYPES.contains(value.getClass())
                    // collection values are skipped
                    && !property.isCollection()
                    // map values are skipped
                    && !property.isMap()
                    // blank nodes are skipped
                    && !(value instanceof BID)) {
                Expression propertyPath = (Expression) entityPath.get(property.getName(), property.getType());
                conditions.and(ExpressionUtils.eqConst(propertyPath, value));
            }
        }
    }

    @Nullable
    public T uniqueResult() {
        if (conditions.getValue() != null) {
            return session.from(entityPath).where(conditions).uniqueResult(entityPath);
        } else {
            return null;
        }
    }

    public List list() {
        if (conditions.getValue() != null) {
            return session.from(entityPath).where(conditions).list(entityPath);
        } else {
            return Collections.emptyList();
        }
    }

}