protected function pushWhere()
    {
        if( empty($this->where) ) {
            return;
        }

        $this->parts[] = 'WHERE';
        foreach( $this->where as $w ) {
            $where = $w[0];
            $value = isset($w[1]) ? $w[1] : null;
            $type = isset($w[2]) ? $w[2] : null;
            if( $where instanceof Expression ) {
                $this->parts[] = (string) $where;
            } else if( count($w) == 3 ) {
                $this->parts[] = $this->quoteIdentifierIfNotExpression($where);
                $this->parts[] = $type;
                $tmp = '';
                foreach( $value as $val ) {
                    $tmp .= '?, ';
                    $this->params[] = $val;
                }
                $this->parts[] = '(' . substr($tmp, 0, -2) . ')';
            } else if( false !== strpos($where, '?') ) {
                $this->parts[] = $where; //$this->quoteIdentifierIfNotExpression($where);
                $this->params[] = $value;
            } else {
                $this->parts[] = $this->quoteIdentifierIfNotExpression($where);
                $this->parts[] = '=';
                if( $value instanceof Expression ) {
                    $this->parts[] = (string) $value;
                } else {
                    $this->parts[] = '?';
                    $this->params[] = $value;
                }
            }
            $this->parts[] = '&&';
        }
        array_pop($this->parts);
    }