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

com.redhat.lightblue.query.BasicProjection Maven / Gradle / Ivy

/*
 Copyright 2013 Red Hat, Inc. and/or its affiliates.

 This file is part of lightblue.

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see .
 */
package com.redhat.lightblue.query;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.redhat.lightblue.util.Error;
import com.redhat.lightblue.util.Path;

/**
 * Base class for field and array projections
 */
public abstract class BasicProjection extends Projection {

    private static final long serialVersionUID = 1L;

    /**
     * Parses a field or array projection from the given json object
     */
    public static BasicProjection fromJson(ObjectNode node) {
        String field = node.get("field").asText();
        if (field == null) {
            throw Error.get(QueryConstants.ERR_INVALID_PROJECTION, "field");
        }

        Path path = getNonRelativePath(new Path(field));

        // Processing of optional elements. We decide on the type of
        // the final object based on what fields this object has
        JsonNode x = node.get("include");
        boolean include;
        if (x == null) {
            include = true;
        } else {
            include = x.asBoolean();
        }

        Projection projection;
        x = node.get("projection");

        if (x != null) {
            projection = Projection.fromJson(x);
        } else {
            x = node.get("project");
            if (x != null) {
                projection = Projection.fromJson(x);
            } else {
                projection = null;
            }
        }

        x = node.get("sort");
        Sort sort;
        if (x != null) {
            sort = Sort.fromJson(x);
        } else {
            sort = null;
        }

        x = node.get("range");
        if (x != null) {
            if (x instanceof ArrayNode
                    && ((ArrayNode) x).size() == 2) {
                Integer to;
                Integer from = ((ArrayNode) x).get(0).asInt();
                if (!((ArrayNode) x).get(1).isNull()) {
                    to = ((ArrayNode) x).get(1).asInt();
                } else {
                    to = null;
                }
                return new ArrayRangeProjection(path,
                        include,
                        projection,
                        sort,
                        from, to);
            } else {
                throw Error.get(QueryConstants.ERR_INVALID_ARRAY_RANGE_PROJECTION, node.toString());
            }
        }
        x = node.get("match");
        if (x != null) {
            return new ArrayQueryMatchProjection(path,
                    include,
                    projection,
                    sort,
                    QueryExpression.fromJson(x));
        }
        x = node.get("recursive");
        return new FieldProjection(path, include,
                x == null ? false : x.asBoolean());
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy