Какви режийни разходи има ormLite при запитване или създаване на обект с ForeignCollection?

Имам маса с играчи и друга маса с игри. Между тях има връзка Player----(1..n)[Game] (дефинициите на полетата може да не са напълно правилни):

// Player
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
public String name;

@ForeignCollectionField(
    eager = true,
    maxEagerLevel = 3)
public ForeignCollection<Game> games;


// Game
@DatabaseField
String title;

@DatabaseField
String playerName;

Бих искал да получа и върна списък с всички игри. Кога режийните позволяват на ormLite да направи избора за ForeignCollection? Или би било по-добре да направите нещо подобно:

    final List<Game> allGames = daoGames.getAllGroupedByName();
    final List<Player> allPlayers = gameDao.getAll();

    final HashMap<String, List<Game>> games = new HashMap<String, List<Game>>();
    for (Game currentGame : allGames) {
        final String player = currentGame.playerName;
        if (games.get(player) == null) {
            games.put(player, new ArrayList<Game>());
        }
        final List<Game> gamesOfPlayer = games.get(player);
        gamesOfPlayer.add(currentGame);
    }
    for (Player player : allPlayers) {
        player.games = games.get(player.name);
    }

Предполагам, че ormLite ще направи заявка за всеки играч. Дали това е голямо натоварване в сравнение с единия daoGames.getAllGroupedByName() (макар че groupBy дори не е необходим)?


person Miklos Jakab    schedule 04.09.2014    source източник


Отговори (1)


Предполагам, че ormLite ще направи заявка за всеки играч. Дали това е голямо натоварване в сравнение с единия daoGames.getAllGroupedByName() (макар че groupBy дори не е необходим)?

Това е вярно. ORMLite не прави това много ефективно с отделна заявка за всеки Player резултат. Вашият механизъм да направите getAll() и да ги съпоставите на ръка най-вероятно ще бъде по-бърз.

Бих използвал ArrayList, освен ако наистина не се нуждаете от LinkedList възможности.

person Gray    schedule 04.09.2014
comment
Благодаря ви, че разяснихте това. - person Miklos Jakab; 04.09.2014
comment
Относно изпълнението на списъка: в този конкретен случай списъкът ще бъде обходен само, което е O(n) (същото би било за ArrayList). Инициализирането е малко по-бързо с LinkedList, тъй като размерът не е известен предварително, така че ще е необходимо преразпределение за ArrayList (освен ако не е инициализиран с allGames.size()). Но си прав, като цяло ArrayList вероятно е по-добър. Въпреки че LinkedList генерира повече боклук обекти, които ще трябва да бъдат събрани. хм Накрая може да премина към ArrayList :-) - person Miklos Jakab; 04.09.2014
comment
Като цяло ArrayList е много по-добре, освен ако не говорите за тонове обекти, които са премахнати или преместени в List. - person Gray; 05.09.2014