@Transaction @Query("SELECT * FROM " + STREAM_TABLE + " INNER JOIN " + // get ids of streams of the given playlist "(SELECT " + JOIN_STREAM_ID + "," + JOIN_INDEX + " FROM " + PLAYLIST_STREAM_JOIN_TABLE + " WHERE " + JOIN_PLAYLIST_ID + " = :playlistId)" + // then merge with the stream metadata " ON " + STREAM_ID + " = " + JOIN_STREAM_ID + " ORDER BY " + JOIN_INDEX + " ASC") public abstract Flowable<List<PlaylistStreamEntry>> getOrderedStreamsOf(long playlistId);
@Transaction @Query("SELECT " + PLAYLIST_ID + ", " + PLAYLIST_NAME + ", " + PLAYLIST_THUMBNAIL_URL + ", " + "COALESCE(COUNT(" + JOIN_PLAYLIST_ID + "), 0) AS " + PLAYLIST_STREAM_COUNT + " FROM " + PLAYLIST_TABLE + " LEFT JOIN " + PLAYLIST_STREAM_JOIN_TABLE + " ON " + PLAYLIST_ID + " = " + JOIN_PLAYLIST_ID + " GROUP BY " + JOIN_PLAYLIST_ID + " ORDER BY " + PLAYLIST_NAME + " COLLATE NOCASE ASC") public abstract Flowable<List<PlaylistMetadataEntry>> getPlaylistMetadata(); }
@Transaction public long upsert(StreamStateEntity stream) { silentInsertInternal(stream); return update(stream); } }
@Transaction public List<Long> upsertAll(List<StreamEntity> streams) { silentInsertAllInternal(streams); final List<Long> streamIds = new ArrayList<>(streams.size()); for (StreamEntity stream : streams) { final Long streamId = getStreamIdInternal(stream.getServiceId(), stream.getUrl()); if (streamId == null) { throw new IllegalStateException("StreamID cannot be null just after insertion."); } streamIds.add(streamId); stream.setUid(streamId); } update(streams); return streamIds; }
@Transaction public long upsert(PlaylistRemoteEntity playlist) { final Long playlistId = getPlaylistIdInternal(playlist.getServiceId(), playlist.getUrl()); if (playlistId == null) { return insert(playlist); } else { playlist.setUid(playlistId); update(playlist); return playlistId; } }
@Transaction public long upsert(StreamEntity stream) { final Long streamIdCandidate = getStreamIdInternal(stream.getServiceId(), stream.getUrl()); if (streamIdCandidate == null) { return insert(stream); } else { stream.setUid(streamIdCandidate); update(stream); return streamIdCandidate; } }
@Transaction public List<SubscriptionEntity> upsertAll(List<SubscriptionEntity> entities) { for (SubscriptionEntity entity : entities) { Long uid = insertInternal(entity); if (uid != -1) { entity.setUid(uid); continue; } uid = getSubscriptionIdInternal(entity.getServiceId(), entity.getUrl()); entity.setUid(uid); if (uid == -1) { throw new IllegalStateException("Invalid subscription id (-1)"); } update(entity); } return entities; } }
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND rec.id = :id") LiveData<TimerRecording> loadRecordingById(String id);
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND rec.id = :id") TimerRecording loadRecordingByIdSync(String id);
@Transaction @Query(EPG_CHANNEL_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + ORDER_BY) LiveData<List<EpgChannel>> loadAllEpgChannels(int sortOrder);
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND rec.id = :id") public abstract LiveData<Recording> loadRecordingById(int id);
@Transaction @Query(PROGRAM_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND p.channel_id = :channelId " + " AND ((p.start >= :time) " + " OR (p.start <= :time AND p.stop >= :time)) " + "GROUP BY p.id " + "ORDER BY p.start ASC") LiveData<List<Program>> loadProgramsFromChannelFromTime(int channelId, long time);
@Transaction @Query(PROGRAM_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + "GROUP BY p.id " + "ORDER BY p.start, p.channel_name ASC") List<Program> loadProgramsSync();
@Transaction @Query(CHANNEL_BASE_QUERY + "LEFT JOIN programs AS program ON program.start <= :time AND program.stop > :time AND program.channel_id = c.id " + "LEFT JOIN programs AS next_program ON next_program.start = program.stop AND next_program.channel_id = c.id " + "WHERE " + CONNECTION_IS_ACTIVE + "GROUP BY c.id " + ORDER_BY) List<Channel> loadAllChannelsByTimeSync(long time, int sortOrder);
@Transaction @Query(CHANNEL_BASE_QUERY + "LEFT JOIN programs AS program ON program.start <= :time AND program.stop > :time AND program.channel_id = c.id " + "LEFT JOIN programs AS next_program ON next_program.start = program.stop AND next_program.channel_id = c.id " + "WHERE " + CONNECTION_IS_ACTIVE + " AND c.id IN (SELECT channel_id FROM tags_and_channels WHERE tag_id IN (:tagIds)) " + "GROUP BY c.id " + ORDER_BY) List<Channel> loadAllChannelsByTimeAndTagSync(long time, Set<Integer> tagIds, int sortOrder);
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND rec.error = 'File missing' AND rec.state = 'completed'" + "ORDER BY rec.start DESC") public abstract LiveData<List<Recording>> loadAllRemovedRecordings();
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND rec.id = :id") LiveData<SeriesRecording> loadRecordingById(String id);
@Transaction @Query(EPG_CHANNEL_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND c.id IN (SELECT channel_id FROM tags_and_channels WHERE tag_id IN (:tagIds)) " + ORDER_BY) LiveData<List<EpgChannel>> loadAllEpgChannelsByTag(int sortOrder, List<Integer> tagIds); }
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE + " AND (rec.error IS NOT NULL AND (rec.state='missed' OR rec.state='invalid')) " + " OR (rec.error IS NULL AND rec.state='missed') " + " OR (rec.error='Aborted by user' AND rec.state='completed')" + "ORDER BY rec.start DESC") public abstract LiveData<List<Recording>> loadAllFailedRecordings();
@Transaction @Query(RECORDING_BASE_QUERY + "WHERE " + CONNECTION_IS_ACTIVE) LiveData<List<SeriesRecording>> loadAllRecordings();