public static Query toNativeQuery()

in stack/mongo-emulator/src/main/java/org/apache/usergrid/mongo/query/MongoQueryParser.java [62:137]


    public static Query toNativeQuery( BSONObject query, BSONObject fieldSelector, int numberToReturn ) {
        // TODO overload? or add?
        if ( query == null ) {
            return null;
        }

        BasicBSONObject query_expression = null;
        BasicBSONObject field_selector = null;
        BasicBSONObject sort_order = null;

        Object o = query.get( "$query" );
        if ( !( o instanceof BasicBSONObject ) ) {
            o = query.get( "query" );
        }
        if ( o instanceof BasicBSONObject ) {
            query_expression = ( BasicBSONObject ) o;
        }

        o = query.get( "$orderby" );
        if ( !( o instanceof BasicBSONObject ) ) {
            o = query.get( "orderby" );
        }
        if ( o instanceof BasicBSONObject ) {
            sort_order = ( BasicBSONObject ) o;
        }

        if ( ( query_expression == null ) && ( query instanceof BasicBSONObject ) ) {
            query_expression = ( BasicBSONObject ) query;
            query_expression.removeField( "$orderby" );
            query_expression.removeField( "$max" );
            query_expression.removeField( "$min" );
        }


        if ( ( query_expression == null ) && ( sort_order == null ) ) {
            return null;
        }

        if ( query_expression.size() == 0 && sort_order != null ) {
            if ( sort_order.size() == 0 ) {
                return null;
            }
            if ( ( sort_order.size() == 1 ) && sort_order.containsField( "_id" ) ) {
                return null;
            }
        }

        Query q = new Query();

        if ( numberToReturn > 0 ) {
            q.setLimit( numberToReturn );
        }

        if ( query_expression != null ) {
            Operand root = eval( query_expression );
            q.setRootOperand( root );
        }

        if ( fieldSelector != null ) {
            for ( String field : fieldSelector.keySet() ) {
                q.addSelect( field, field );
            }
        }


        if ( sort_order != null ) {
            for ( String sort : sort_order.keySet() ) {
                if ( !"_id".equals( sort ) ) {
                    int s = getIntValue( sort_order.toMap(), "_id", 1 );
                    q.addSort( sort, s >= 0 ? SortDirection.ASCENDING : SortDirection.DESCENDING );
                }
            }
        }

        return q;
    }