Search in sources :

Example 16 with Id

use of siena.Id in project siena by mandubian.

the class GaeQueryUtils method addFiltersOrders.

public static <T> com.google.appengine.api.datastore.Query addFiltersOrders(QueryData<T> query, com.google.appengine.api.datastore.Query q, Key parentKey) {
    List<QueryFilter> filters = query.getFilters();
    for (QueryFilter filter : filters) {
        if (QueryFilterSimple.class.isAssignableFrom(filter.getClass())) {
            QueryFilterSimple qf = (QueryFilterSimple) filter;
            Field f = qf.field;
            String propertyName = ClassInfo.getColumnNames(f)[0];
            Object value = qf.value;
            FilterOperator op = operators.get(qf.operator);
            // IN and NOT_EQUAL doesn't allow to use cursors
            if (op == FilterOperator.IN || op == FilterOperator.NOT_EQUAL) {
                QueryOptionGaeContext gaeCtx = (QueryOptionGaeContext) query.option(QueryOptionGaeContext.ID);
                if (gaeCtx == null) {
                    gaeCtx = new QueryOptionGaeContext();
                    query.options().put(gaeCtx.type, gaeCtx);
                }
                gaeCtx.useCursor = false;
                query.option(QueryOptionOffset.ID).activate();
            }
            if (value != null && ClassInfo.isModel(value.getClass())) {
                Key key = GaeMappingUtils.getKey(value);
                q.addFilter(propertyName, op, key);
            } else {
                if (ClassInfo.isId(f)) {
                    Id id = f.getAnnotation(Id.class);
                    switch(id.value()) {
                        case NONE:
                            if (value != null) {
                                if (!Collection.class.isAssignableFrom(value.getClass())) {
                                    // long or string goes toString
                                    Key key;
                                    if (parentKey == null) {
                                        key = KeyFactory.createKey(q.getKind(), value.toString());
                                    } else {
                                        key = KeyFactory.createKey(parentKey, q.getKind(), value.toString());
                                    }
                                    q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, key);
                                } else {
                                    List<Key> keys = new ArrayList<Key>();
                                    for (Object val : (Collection<?>) value) {
                                        if (parentKey == null) {
                                            keys.add(KeyFactory.createKey(q.getKind(), val.toString()));
                                        } else {
                                            keys.add(KeyFactory.createKey(parentKey, q.getKind(), val.toString()));
                                        }
                                    }
                                    q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, keys);
                                }
                            }
                            break;
                        case AUTO_INCREMENT:
                            if (value != null) {
                                if (!Collection.class.isAssignableFrom(value.getClass())) {
                                    Key key;
                                    Class<?> type = f.getType();
                                    if (Long.TYPE == type || Long.class.isAssignableFrom(type)) {
                                        if (parentKey == null) {
                                            key = KeyFactory.createKey(q.getKind(), (Long) value);
                                        } else {
                                            key = KeyFactory.createKey(parentKey, q.getKind(), (Long) value);
                                        }
                                    } else {
                                        if (parentKey == null) {
                                            key = KeyFactory.createKey(q.getKind(), value.toString());
                                        } else {
                                            key = KeyFactory.createKey(parentKey, q.getKind(), value.toString());
                                        }
                                    }
                                    q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, key);
                                } else {
                                    List<Key> keys = new ArrayList<Key>();
                                    for (Object val : (Collection<?>) value) {
                                        if (value instanceof String)
                                            val = Long.parseLong((String) val);
                                        if (parentKey == null) {
                                            keys.add(KeyFactory.createKey(q.getKind(), (Long) val));
                                        } else {
                                            keys.add(KeyFactory.createKey(parentKey, q.getKind(), (Long) val));
                                        }
                                    }
                                    q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, keys);
                                }
                            }
                            break;
                        case UUID:
                            if (value != null) {
                                if (!Collection.class.isAssignableFrom(value.getClass())) {
                                    // long or string goes toString
                                    Key key;
                                    if (parentKey == null) {
                                        key = KeyFactory.createKey(q.getKind(), value.toString());
                                    } else {
                                        key = KeyFactory.createKey(parentKey, q.getKind(), value.toString());
                                    }
                                    q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, key);
                                } else {
                                    List<Key> keys = new ArrayList<Key>();
                                    for (Object val : (Collection<?>) value) {
                                        keys.add(KeyFactory.createKey(q.getKind(), val.toString()));
                                    }
                                    q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, keys);
                                }
                            }
                            break;
                        default:
                            throw new SienaException("Id Generator " + id.value() + " not supported");
                    }
                } else if (Enum.class.isAssignableFrom(f.getType())) {
                    value = value.toString();
                    q.addFilter(propertyName, op, value);
                } else {
                    q.addFilter(propertyName, op, value);
                }
            }
        } else if (QueryFilterSearch.class.isAssignableFrom(filter.getClass())) {
            Class<T> clazz = query.getQueriedClass();
            QueryFilterSearch qf = (QueryFilterSearch) filter;
            if (qf.fields.length > 1)
                throw new SienaException("Search not possible for several fields in GAE: only one field");
            try {
                Field field = Util.getField(clazz, qf.fields[0]);
                if (field.isAnnotationPresent(Unindexed.class)) {
                    throw new SienaException("Cannot search the @Unindexed field " + field.getName());
                }
                // cuts match into words
                String[] words = qf.match.split("\\s");
                // if several words, then only OR operator represented by IN GAE
                Pattern pNormal = Pattern.compile("[^\\*](\\w+)[^\\*]");
                if (words.length > 1) {
                    for (String word : words) {
                        if (!pNormal.matcher(word).matches()) {
                            throw new SienaException("Cannot do a multiwords search with the * operator");
                        }
                    }
                    List<String> wordList = new ArrayList<String>();
                    Collections.addAll(wordList, words);
                    addSearchFilterIn(q, field, wordList);
                } else {
                    // searches for pattern such as "alpha*" or "*alpha" or "alpha"
                    Pattern pStart = Pattern.compile("(\\w+)\\*");
                    String word = words[0];
                    Matcher matcher = pStart.matcher(word);
                    if (matcher.matches()) {
                        String realWord = matcher.group(1);
                        addSearchFilterBeginsWith(q, field, realWord);
                        continue;
                    }
                    matcher = pNormal.matcher(word);
                    if (matcher.matches()) {
                        addSearchFilterEquals(q, field, word);
                        continue;
                    }
                    Pattern pEnd = Pattern.compile("\\*(\\w+)");
                    matcher = pEnd.matcher(word);
                    if (matcher.matches()) {
                        throw new SienaException("Cannot do a \"*word\" search in GAE");
                    }
                }
            } catch (Exception e) {
                throw new SienaException(e);
            }
            break;
        } else if (QueryFilterEmbedded.class.isAssignableFrom(filter.getClass())) {
            QueryFilterEmbedded qf = (QueryFilterEmbedded) filter;
            String propName = "";
            int sz = qf.fields.size();
            for (int i = 0; i < sz; i++) {
                propName += ClassInfo.getSingleColumnName(qf.fields.get(i));
                if (i < sz - 1) {
                    propName += qf.fieldSeparator;
                }
            }
            Object value = qf.value;
            FilterOperator op = operators.get(qf.operator);
            // IN and NOT_EQUAL doesn't allow to use cursors
            if (op == FilterOperator.IN || op == FilterOperator.NOT_EQUAL) {
                QueryOptionGaeContext gaeCtx = (QueryOptionGaeContext) query.option(QueryOptionGaeContext.ID);
                if (gaeCtx == null) {
                    gaeCtx = new QueryOptionGaeContext();
                    query.options().put(gaeCtx.type, gaeCtx);
                }
                gaeCtx.useCursor = false;
                query.option(QueryOptionOffset.ID).activate();
            }
            q.addFilter(propName, op, value);
        }
    }
    // adds filter on owners
    List<QueryOwned> ownees = query.getOwnees();
    for (QueryOwned ownee : ownees) {
        String propertyName = ClassInfo.getSimplestColumnName(ownee.field);
        FilterOperator op = operators.get("=");
        Key key = GaeMappingUtils.getKey(ownee.owner);
        q.addFilter(propertyName, op, key);
    }
    List<QueryOrder> orders = query.getOrders();
    for (QueryOrder order : orders) {
        Field f = order.field;
        if (ClassInfo.isId(f)) {
            q.addSort(Entity.KEY_RESERVED_PROPERTY, order.ascending ? SortDirection.ASCENDING : SortDirection.DESCENDING);
        } else {
            q.addSort(ClassInfo.getColumnNames(f)[0], order.ascending ? SortDirection.ASCENDING : SortDirection.DESCENDING);
        }
    }
    return q;
}
Also used : Matcher(java.util.regex.Matcher) ArrayList(java.util.ArrayList) QueryFilterSearch(siena.QueryFilterSearch) Field(java.lang.reflect.Field) QueryFilterSimple(siena.QueryFilterSimple) ArrayList(java.util.ArrayList) List(java.util.List) SienaException(siena.SienaException) Pattern(java.util.regex.Pattern) SienaException(siena.SienaException) SienaRestrictedApiException(siena.SienaRestrictedApiException) QueryOrder(siena.QueryOrder) FilterOperator(com.google.appengine.api.datastore.Query.FilterOperator) QueryOwned(siena.QueryOwned) QueryFilter(siena.QueryFilter) QueryFilterEmbedded(siena.core.QueryFilterEmbedded) Collection(java.util.Collection) Id(siena.Id) Key(com.google.appengine.api.datastore.Key)

Example 17 with Id

use of siena.Id in project siena by mandubian.

the class GaeMappingUtils method createEntityInstance.

public static Entity createEntityInstance(Field idField, ClassInfo info, Object obj) {
    Entity entity = null;
    Id id = idField.getAnnotation(Id.class);
    Class<?> type = idField.getType();
    if (id != null) {
        switch(id.value()) {
            case NONE:
                Object idVal = null;
                idVal = Util.readField(obj, idField);
                if (idVal == null)
                    throw new SienaException("Id Field " + idField.getName() + " value null");
                String keyVal = Util.toString(idField, idVal);
                entity = new Entity(info.tableName, keyVal);
                break;
            case AUTO_INCREMENT:
                // manages String ID as not long!!!
                if (Long.TYPE == type || Long.class.isAssignableFrom(type)) {
                    entity = new Entity(info.tableName);
                } else {
                    Object idStringVal = null;
                    idStringVal = Util.readField(obj, idField);
                    if (idStringVal == null)
                        throw new SienaException("Id Field " + idField.getName() + " value null");
                    String keyStringVal = Util.toString(idField, idStringVal);
                    entity = new Entity(info.tableName, keyStringVal);
                }
                break;
            case UUID:
                entity = new Entity(info.tableName, UUID.randomUUID().toString());
                break;
            default:
                throw new SienaRestrictedApiException("DB", "createEntityInstance", "Id Generator " + id.value() + " not supported");
        }
    } else
        throw new SienaException("Field " + idField.getName() + " is not an @Id field");
    return entity;
}
Also used : Entity(com.google.appengine.api.datastore.Entity) SienaRestrictedApiException(siena.SienaRestrictedApiException) Id(siena.Id) SienaException(siena.SienaException)

Aggregations

Id (siena.Id)17 Field (java.lang.reflect.Field)14 SienaException (siena.SienaException)14 SienaRestrictedApiException (siena.SienaRestrictedApiException)13 IOException (java.io.IOException)7 PreparedStatement (java.sql.PreparedStatement)7 ResultSet (java.sql.ResultSet)5 SQLException (java.sql.SQLException)4 ArrayList (java.util.ArrayList)4 HashMap (java.util.HashMap)3 List (java.util.List)3 ClassInfo (siena.ClassInfo)3 Entity (com.google.appengine.api.datastore.Entity)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 Key (com.google.appengine.api.datastore.Key)1 FilterOperator (com.google.appengine.api.datastore.Query.FilterOperator)1 Collection (java.util.Collection)1 UUID (java.util.UUID)1 Matcher (java.util.regex.Matcher)1 Pattern (java.util.regex.Pattern)1