Skip to content
This repository has been archived by the owner on Mar 3, 2024. It is now read-only.

Качмар Евгений, ИТМО ФИТиП М33331, Reverse Iterator #297

Open
wants to merge 74 commits into
base: main
Choose a base branch
from

Conversation

Jenshen30
Copy link
Contributor

No description provided.

@incubos incubos requested a review from AlexeyShik December 5, 2023 17:05
@AlexeyShik AlexeyShik requested review from ikriushenkov and removed request for AlexeyShik December 21, 2023 07:57
Copy link
Contributor

@ikriushenkov ikriushenkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть сомнительные решения и лишние аллокации. Решение не работает в случае, когда нам нужны данные не с конца.
Также в задании планировалась отдельная функция descendingGet(from, to)
Пока 10 баллов

@@ -29,6 +29,10 @@ public InMemoryDao(Config conf) {

@Override
public Iterator<Entry<MemorySegment>> get(MemorySegment from, MemorySegment to) {
if (new MemSegComparatorNull().compare(from, to) > 0) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Создание объекта на каждый вызов get. Зачем?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И вы все еще нарушаете инвариант Comparable:

The implementor must ensure that signum(compare(x, y)) == -signum(compare(y, x)) for all x and y. (This implies that compare(x, y) must throw an exception if and only if compare(y, x) throws an exception.)

@@ -44,6 +48,11 @@ public Iterator<Entry<MemorySegment>> get(MemorySegment from, MemorySegment to)
return new SSTableIterator(dataSlice.values().iterator(), controller, from, to);
}

private Iterator<Entry<MemorySegment>> reverseIter(MemorySegment fromRightSide, MemorySegment toLeftSide) {
return new SSTableIterator(getMemTable().reversed().values().iterator(),
controller, fromRightSide, toLeftSide, true, new MemSegComparatorNull().reversed());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь вы создаете еще 2 компаратора, один из которых полностью идентичен созданному ранее. Итого создание 3 компараторов при каждом вызове get, когда можно их вообще не создавать

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Всегда передается полная мапа, начало игнорируется, поэтому тестов, где from не последний элемент нет. Непонятно тогда, зачем обрезать конец мапы в случае натурального порядка, если он все равно учитывает конец внутри

return;
}

if (!mp.containsKey(kv.key())) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

putIfAbsent

Не должно быть лишних обращений к структурам данных (особенно конкурентным)

Comment on lines +32 to +36
if (oldInfo.isReversedToIter) {
insertNew(mp, controller, controller.getPrevInfo(oldInfo, to), to);
} else {
insertNew(mp, controller, controller.getNextInfo(oldInfo, to), to);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше заменить на цикл. Рекурсия тут не оправдана

private final MemorySegment from;
private final MemorySegment to;
private Entry<MemorySegment> head;
private Entry<MemorySegment> keeper;
private boolean isReversed;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

final

Comment on lines +38 to +39
public SSTableIterator(Iterator<Entry<MemorySegment>> it, SSTablesController controller,
MemorySegment from, MemorySegment to, boolean isReversed, Comparator<MemorySegment> comp) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Конструктор - копия первого, в котором почему-то явно не инициализировано isReversed, из-за чего оно не final

Comment on lines +136 to +142
if (isReversed) {
IteratorUtils.insertNew(mp, controller,
controller.getPrevInfo(mp.remove(key), to), to);
return;
}
IteratorUtils.insertNew(mp, controller,
controller.getNextInfo(mp.remove(key), to), to);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хочется какой-то консистентности. Или все такие места

if (isReversed) {
    ...
}  else {
    ...
}

Или

if (isReversed) {
    ...
    return
} 
...

return r == numberOfEntries ? -1 : r;
}

public static long searchKeyInFileReversed(SSTablesController controller,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просто идея
Функция аналогичная предыдущей. Раз вы уже выделили компаратор в отдельные функции, то можно просто передавать его как параметр

}

@DaoTest(stage = 4, maxStage = 4)
void ssTablesCheckOrdinary(Dao<String, Entry<String>> dao) throws IOException {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет смысла копировать тесты, которые уже есть в других классах, так как решение тестируется на всех тестах.

import java.io.IOException;
import java.util.List;

public class ReverseIteratorTest extends BaseTest {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Во всех тестах представлен только один вариант - с последнего до первого индекса. Варианты не с начала не созданы видимо потому что не работают, но хотелось бы увидеть другие тесты - на пустой итератор, на один элемент, на все хранилище в обратном порядке

Copy link
Contributor

@ikriushenkov ikriushenkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть время переделать на этой неделе, чтобы получить А

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants