private function _prepareBuilder()
    {
        $builder = $this->_builder;
        $params = Input::get();

        /*
         * START filters
         */
        if ($this->renderFilterForm()) {
            foreach ($this->_columns as $columnData) {
                $column = new Column($columnData);
                if (!$column->searchable()) {
                    // Not a searchable column - skip it
                    continue;
                }

                if (!isset($params['resource_table_'.$column->index()])) {
                    // Searched string not found in GET query
                    continue;
                }

                $value = $params['resource_table_'.$column->index()];
                if (!$value || !is_string($value)) {
                    // Skip empty values
                    continue;
                }

                $value = $this->_prepareFilterValue($columnData, $value);
                switch ($column->searchType()) {

                    // Use simple WHERE = 'value' for selects
                    case 'select':
                        if (ResourceTable::ALL_SELECT_VALUES_KEY == $value) {
                            // Any value in select - skip it
                            continue;
                        }
                        $builder = $this->_addQueryCondition($builder, $column->queryConditionType(), $column->getDatabaseName(), '=', $value);
                        break;

                    // Use LIKE '%value%' for strings
                    case 'string':
                    default:
                        $builder = $this->_addQueryCondition($builder, $column->queryConditionType(), $column->getDatabaseName(), 'LIKE', '%'.$value.'%');
                        break;
                }
            }
        }
        /*
         * END filters
         */

        /*
         * START pagination
         */
        if ($this->_paginate) {
            if (isset($params['per_page']) && is_numeric($params['per_page']) && $params['per_page'] > 0) {
                // Get per_page from GET
                $this->_perPage = (int)$params['per_page'];
            }

            if (isset($params['page']) && is_numeric($params['page']) && $params['page'] > 1) {
                // Get page from GET
                $this->_page = (int)$params['page'];
            }
            $toSkip = ($this->_page * $this->_perPage) - $this->_perPage;

            // A the end set pagination
            $this->_totalItems = $this->_getCountForPagination($builder);
            $builder = $builder->skip($toSkip)->take($this->_perPage);
        }
        /*
         * END pagination
         */

        /*
         * START sort
         */
        if ($this->_validSort($params)) {
            // If sort configuration is valid then set it
            $this->sort($params['order_by'], strtoupper($params['order_dir']));
        }

        // Set sort configuration
        $sort = $this->getSort();
        if ($sort['index'] && $sort['dir']) {
            $builder = $builder->orderBy($sort['index'], $sort['dir']);
        }
        /*
         * END sort
         */

        $this->_builder = $builder;
    }