Exemplo n.º 1
0
 /**
  * THREAD=REFS sorting implementation (based on provided index)
  *
  * @param rcube_result_index $index  Sorted message identifiers
  */
 public function sort($index)
 {
     $this->sort_order = $index->get_parameters('ORDER');
     if (empty($this->raw_data)) {
         return;
     }
     // when sorting search result it's good to make the index smaller
     if ($index->count() != $this->count_messages()) {
         $index->intersect($this->get());
     }
     $result = array_fill_keys($index->get(), null);
     $datalen = strlen($this->raw_data);
     $start = 0;
     // Here we're parsing raw_data twice, we want only one big array
     // in memory at a time
     // Assign roots
     while (($pos = @strpos($this->raw_data, self::SEPARATOR_ELEMENT, $start)) || $start < $datalen && ($pos = $datalen)) {
         $len = $pos - $start;
         $elem = substr($this->raw_data, $start, $len);
         $start = $pos + 1;
         $items = explode(self::SEPARATOR_ITEM, $elem);
         $root = (int) array_shift($items);
         $result[$elem] = $elem;
         foreach ($items as $item) {
             list($lv, $id) = explode(self::SEPARATOR_LEVEL, $item);
             $result[$id] = $root;
         }
     }
     // get only unique roots
     $result = array_filter($result);
     // make sure there are no nulls
     $result = array_unique($result, SORT_NUMERIC);
     // Re-sort raw data
     $result = array_fill_keys($result, null);
     $start = 0;
     while (($pos = @strpos($this->raw_data, self::SEPARATOR_ELEMENT, $start)) || $start < $datalen && ($pos = $datalen)) {
         $len = $pos - $start;
         $elem = substr($this->raw_data, $start, $len);
         $start = $pos + 1;
         $npos = strpos($elem, self::SEPARATOR_ITEM);
         $root = (int) ($npos ? substr($elem, 0, $npos) : $elem);
         $result[$root] = $elem;
     }
     $this->raw_data = implode(self::SEPARATOR_ELEMENT, $result);
 }
Exemplo n.º 2
0
 /**
  * thread parser test
  */
 function test_parse()
 {
     $text = "* SORT 2001 2002 2035 2036 2037 2038 2044 2046 2043 2045 2226 2225 2224 2223";
     $object = new rcube_result_index('INBOX', $text);
     $this->assertSame(false, $object->is_empty(), "Object is empty");
     $this->assertSame(false, $object->is_error(), "Object is error");
     $this->assertSame(2226, $object->max(), "Max message UID");
     $this->assertSame(2001, $object->min(), "Min message UID");
     $this->assertSame(14, $object->count_messages(), "Messages count");
     $this->assertSame(14, $object->count(), "Messages count");
     $this->assertSame(1, $object->exists(2002, true), "Message exists");
     $this->assertSame(true, $object->exists(2002), "Message exists (bool)");
     $this->assertSame(2001, $object->get_element('FIRST'), "Get first element");
     $this->assertSame(2223, $object->get_element('LAST'), "Get last element");
     $this->assertSame(2035, (int) $object->get_element(2), "Get specified element");
     $this->assertSame("2001:2002,2035:2038,2043:2046,2223:2226", $object->get_compressed(), "Get compressed index");
     $this->assertSame('INBOX', $object->get_parameters('MAILBOX'), "Get parameter");
     $clone = clone $object;
     $clone->filter(array(2035, 2002));
     $this->assertSame(2, $clone->count(), "Messages count (filtered)");
     $this->assertSame(2002, $clone->get_element('FIRST'), "Get first element (filtered)");
     $clone = clone $object;
     $clone->revert();
     $this->assertSame(14, $clone->count(), "Messages count (reverted)");
     $this->assertSame(12, $clone->exists(2002, true), "Message exists (reverted)");
     $this->assertSame(true, $clone->exists(2002), "Message exists (bool) (reverted)");
     $this->assertSame(2223, $clone->get_element('FIRST'), "Get first element (reverted)");
     $this->assertSame(2001, $clone->get_element('LAST'), "Get last element (reverted)");
     $this->assertSame(2225, (int) $clone->get_element(2), "Get specified element (reverted)");
     $clone = clone $object;
     $clone->slice(2, 3);
     $this->assertSame(3, $clone->count(), "Messages count (sliced)");
     $this->assertSame(2035, $clone->get_element('FIRST'), "Get first element (sliced)");
     $this->assertSame(2037, $clone->get_element('LAST'), "Get last element (sliced)");
 }