🗊Презентация Лекція. Advanced datastore

Категория: Информатика
Нажмите для полного просмотра!
Лекція. Advanced datastore, слайд №1Лекція. Advanced datastore, слайд №2Лекція. Advanced datastore, слайд №3Лекція. Advanced datastore, слайд №4Лекція. Advanced datastore, слайд №5Лекція. Advanced datastore, слайд №6Лекція. Advanced datastore, слайд №7Лекція. Advanced datastore, слайд №8Лекція. Advanced datastore, слайд №9Лекція. Advanced datastore, слайд №10Лекція. Advanced datastore, слайд №11Лекція. Advanced datastore, слайд №12Лекція. Advanced datastore, слайд №13Лекція. Advanced datastore, слайд №14Лекція. Advanced datastore, слайд №15Лекція. Advanced datastore, слайд №16Лекція. Advanced datastore, слайд №17Лекція. Advanced datastore, слайд №18Лекція. Advanced datastore, слайд №19Лекція. Advanced datastore, слайд №20Лекція. Advanced datastore, слайд №21Лекція. Advanced datastore, слайд №22Лекція. Advanced datastore, слайд №23Лекція. Advanced datastore, слайд №24Лекція. Advanced datastore, слайд №25Лекція. Advanced datastore, слайд №26Лекція. Advanced datastore, слайд №27Лекція. Advanced datastore, слайд №28Лекція. Advanced datastore, слайд №29Лекція. Advanced datastore, слайд №30Лекція. Advanced datastore, слайд №31Лекція. Advanced datastore, слайд №32Лекція. Advanced datastore, слайд №33Лекція. Advanced datastore, слайд №34Лекція. Advanced datastore, слайд №35Лекція. Advanced datastore, слайд №36Лекція. Advanced datastore, слайд №37Лекція. Advanced datastore, слайд №38Лекція. Advanced datastore, слайд №39Лекція. Advanced datastore, слайд №40Лекція. Advanced datastore, слайд №41Лекція. Advanced datastore, слайд №42Лекція. Advanced datastore, слайд №43Лекція. Advanced datastore, слайд №44Лекція. Advanced datastore, слайд №45Лекція. Advanced datastore, слайд №46Лекція. Advanced datastore, слайд №47Лекція. Advanced datastore, слайд №48Лекція. Advanced datastore, слайд №49Лекція. Advanced datastore, слайд №50Лекція. Advanced datastore, слайд №51Лекція. Advanced datastore, слайд №52Лекція. Advanced datastore, слайд №53Лекція. Advanced datastore, слайд №54Лекція. Advanced datastore, слайд №55Лекція. Advanced datastore, слайд №56Лекція. Advanced datastore, слайд №57Лекція. Advanced datastore, слайд №58Лекція. Advanced datastore, слайд №59Лекція. Advanced datastore, слайд №60Лекція. Advanced datastore, слайд №61Лекція. Advanced datastore, слайд №62Лекція. Advanced datastore, слайд №63Лекція. Advanced datastore, слайд №64Лекція. Advanced datastore, слайд №65

Содержание

Вы можете ознакомиться и скачать презентацию на тему Лекція. Advanced datastore. Доклад-сообщение содержит 65 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Лекція 6. Advanced datastore
Глибовець А.М.
Описание слайда:
Лекція 6. Advanced datastore Глибовець А.М.

Слайд 2





Вступ
Минулого разу ми познайомилися з основними операціями по роботі з Datastore
Нам цього достатньо?
Як ви думаєте, чого не вистачає?
Описание слайда:
Вступ Минулого разу ми познайомилися з основними операціями по роботі з Datastore Нам цього достатньо? Як ви думаєте, чого не вистачає?

Слайд 3





Вступ
Transactions
Consistence
Data relationships
Описание слайда:
Вступ Transactions Consistence Data relationships

Слайд 4





Data Relationships
Ancestor
assigned at creation
can never be changed
в нашому застосуванні будуть конференції і користувачі, що створюють конференції
хто буде ancestor?
USER
Описание слайда:
Data Relationships Ancestor assigned at creation can never be changed в нашому застосуванні будуть конференції і користувачі, що створюють конференції хто буде ancestor? USER

Слайд 5





Data Relationships
HAS-A
в нас на конференцію будуть записуватися різні користувачі
таким чином в однієї конференції буде багато відвідувачів
тому вони будуть мати зв’язок HAS-A
Описание слайда:
Data Relationships HAS-A в нас на конференцію будуть записуватися різні користувачі таким чином в однієї конференції буде багато відвідувачів тому вони будуть мати зв’язок HAS-A

Слайд 6





Конференції
Зараз ми спробуємо розібратися з нашими конференціями
нам потрібно навчитися писати запити і використовувати фільтри
розібратися з індексами
розібратися з транзакціями
Описание слайда:
Конференції Зараз ми спробуємо розібратися з нашими конференціями нам потрібно навчитися писати запити і використовувати фільтри розібратися з індексами розібратися з транзакціями

Слайд 7





Створення конференції
Перше з чого ми почнемо, це з створення конференції
Десь так воно має виглядати в вас зараз
Але зараз конференція не створиться, бо ми ще не реалізували API
Описание слайда:
Створення конференції Перше з чого ми почнемо, це з створення конференції Десь так воно має виглядати в вас зараз Але зараз конференція не створиться, бо ми ще не реалізували API

Слайд 8





Створення конференції
Ми хочемо створити Entity конференція таким чином, що б кожна конференція мала свого Parent (користувача, що створює конференцію)
Як ви думаєте навіщо це робити?
знайти всі конференції користувача
при видаленні користувача видалити всі його конференції
Описание слайда:
Створення конференції Ми хочемо створити Entity конференція таким чином, що б кожна конференція мала свого Parent (користувача, що створює конференцію) Як ви думаєте навіщо це робити? знайти всі конференції користувача при видаленні користувача видалити всі його конференції

Слайд 9





Створення конференції
Давайте подивимося на два нові класи:
Conference 
звернемо увагу на нові анотації та методи
ConferenceForm
дуже простий клас, що використовується для веб інтерфейсу
ми вже використовували схожий для Profile
ці класи в додатку до лекції
ви маєте покласти ці файли в вірні пакети
Описание слайда:
Створення конференції Давайте подивимося на два нові класи: Conference звернемо увагу на нові анотації та методи ConferenceForm дуже простий клас, що використовується для веб інтерфейсу ми вже використовували схожий для Profile ці класи в додатку до лекції ви маєте покласти ці файли в вірні пакети

Слайд 10





Анотації
Які анотації нові ми побачили?
Що значить @Index?
Що значить @Parent?
Описание слайда:
Анотації Які анотації нові ми побачили? Що значить @Index? Що значить @Parent?

Слайд 11





OfyService
Тепер нам необхідно внести зміни в OfyService
Ми маємо зареєструвати Conference класс
factory().register(Conference.class);
Описание слайда:
OfyService Тепер нам необхідно внести зміни в OfyService Ми маємо зареєструвати Conference класс factory().register(Conference.class);

Слайд 12





ConferenceApi
Тепер нам необхідно додати певні методи в ConferenceApi
Ми додамо методи
getProfileFromUser
createConference
їхні заглушки також в додатковому коді, подивимося на них
Описание слайда:
ConferenceApi Тепер нам необхідно додати певні методи в ConferenceApi Ми додамо методи getProfileFromUser createConference їхні заглушки також в додатковому коді, подивимося на них

Слайд 13





ConferenceApi
Допишемо код:
Спочатку отримаємо Key<Profile> користувача
Key<Profile> profileKey = Key.create(Profile.class,userId);
Після цього виділимо ключ для нашої конференції
Синтаксис має вигляд
Key<T> key = factory().allocatedId(Entity.Class);
factory() статичний метод в OfyService
Але в нашому випадку це не зовсім вірно так як наш клас Conference має батька Profile
в такому випадку синтаксис має вигляд:
Key<T> key = factory().allocatedId(parentKey,Entity.Class);
Описание слайда:
ConferenceApi Допишемо код: Спочатку отримаємо Key<Profile> користувача Key<Profile> profileKey = Key.create(Profile.class,userId); Після цього виділимо ключ для нашої конференції Синтаксис має вигляд Key<T> key = factory().allocatedId(Entity.Class); factory() статичний метод в OfyService Але в нашому випадку це не зовсім вірно так як наш клас Conference має батька Profile в такому випадку синтаксис має вигляд: Key<T> key = factory().allocatedId(parentKey,Entity.Class);

Слайд 14





ConferenceApi
Раніше ми вже навчилися зберігати сутності
Але в нашому випадку необхідно одразу зберігати дві сутності Profile і Conference
Тоді ми можемо скористатися методом entities()
ofy().save().entities(entity1,entity2,…).now();
Описание слайда:
ConferenceApi Раніше ми вже навчилися зберігати сутності Але в нашому випадку необхідно одразу зберігати дві сутності Profile і Conference Тоді ми можемо скористатися методом entities() ofy().save().entities(entity1,entity2,…).now();

Слайд 15





ConferenceApi
Тепер ми можемо забрати id для Conference маючи ключ
key. getId();
Далі ми заберемо існуючий профайл або створимо новий для користувача з значеннями за замовчанням
Створимо нову конференцію 
і в кінці збережемо разом конференцію і профайл
Описание слайда:
ConferenceApi Тепер ми можемо забрати id для Conference маючи ключ key. getId(); Далі ми заберемо існуючий профайл або створимо новий для користувача з значеннями за замовчанням Створимо нову конференцію і в кінці збережемо разом конференцію і профайл

Слайд 16





Типи запитів
В нашому застосуванні мають бути наступні фільтри:
всі конференції
це запит типу Query by Kind
всі конференції створені користувачем
Query by Kind filtered by Ancestor
всі конференції на які користувач записався
Query by Kind filtered by Property
також в нас буде фільтр за
топіком
початком
кількістю відвідувачів
Описание слайда:
Типи запитів В нашому застосуванні мають бути наступні фільтри: всі конференції це запит типу Query by Kind всі конференції створені користувачем Query by Kind filtered by Ancestor всі конференції на які користувач записався Query by Kind filtered by Property також в нас буде фільтр за топіком початком кількістю відвідувачів

Слайд 17





Запити
Якщо ми знаємо ключ запит простий
Entity entity = ofy().load().key(key).now();
Якщо нам потрібні всі Entity певного типу ми маємо зробити наступну річ:
Спершу ми створюємо запит:
Query query = ofy().load().type(Kind.class);
Також ми може відсортувати результат за певною властивістю
Query query = ofy().load().type(Kind.class).order(“name”);
Потім ми забираємо результат запиту:
List<Kind> results = query.list();
Описание слайда:
Запити Якщо ми знаємо ключ запит простий Entity entity = ofy().load().key(key).now(); Якщо нам потрібні всі Entity певного типу ми маємо зробити наступну річ: Спершу ми створюємо запит: Query query = ofy().load().type(Kind.class); Також ми може відсортувати результат за певною властивістю Query query = ofy().load().type(Kind.class).order(“name”); Потім ми забираємо результат запиту: List<Kind> results = query.list();

Слайд 18





ConferenceApi
Тепер ми маємо додати в ConferenceApi метод queryConferences
код є в додатках
давайте подивимося на нього
зверніть увагу на імпорт, ви маєте приєднати вірну бібліотеку для Query
пізніше ми виправимо даний метод
запустіть проект і протестуйте API, вам мають повернути всі конференції
також в вас має почати працювати вкладка Show Conferences в застосуванні
Описание слайда:
ConferenceApi Тепер ми маємо додати в ConferenceApi метод queryConferences код є в додатках давайте подивимося на нього зверніть увагу на імпорт, ви маєте приєднати вірну бібліотеку для Query пізніше ми виправимо даний метод запустіть проект і протестуйте API, вам мають повернути всі конференції також в вас має почати працювати вкладка Show Conferences в застосуванні

Слайд 19





Ancestor Queries
Як ви пам’ятаєте в кожної конференції є її батько (людина, що створила дану конференцію)
Тепер ми спробуємо забрати всі конференції, що створила одна людина
Запит має наступний вигляд:
Query query = ofy().load().type(Entity.class).ancestor(key);
key of the parent
Описание слайда:
Ancestor Queries Як ви пам’ятаєте в кожної конференції є її батько (людина, що створила дану конференцію) Тепер ми спробуємо забрати всі конференції, що створила одна людина Запит має наступний вигляд: Query query = ofy().load().type(Entity.class).ancestor(key); key of the parent

Слайд 20





Ancestor Queries
Ви маєте самостійно додати метод getConferencesCreated() в ConferenceApi
даний метод має повертати всі конференції створені конкретним користувачем (користувачем, що залогінився)
метод має бути POST
user має бути залогінений
Описание слайда:
Ancestor Queries Ви маєте самостійно додати метод getConferencesCreated() в ConferenceApi даний метод має повертати всі конференції створені конкретним користувачем (користувачем, що залогінився) метод має бути POST user має бути залогінений

Слайд 21





Filter by Property
Тепер ми розглянемо самий цікавий запит, запит за параметрами
Описание слайда:
Filter by Property Тепер ми розглянемо самий цікавий запит, запит за параметрами

Слайд 22





Filter by Property
Описание слайда:
Filter by Property

Слайд 23





Filter by Property
Такі запити мають вигляд:
Query query = ofy().load().type(Kind.class).filter("property operator", "value");
Приклад:
Query query = ofy().load().type(Conference.class).filter(“city =", “London");
Після того як Query об’єкт створений ви не можете його змінити …
Описание слайда:
Filter by Property Такі запити мають вигляд: Query query = ofy().load().type(Kind.class).filter("property operator", "value"); Приклад: Query query = ofy().load().type(Conference.class).filter(“city =", “London"); Після того як Query об’єкт створений ви не можете його змінити …

Слайд 24





Filter by Property
Але ми можемо додавати фільтри до запиту.
Ми можемо розбити створення Query 
Query query = ofy().load().type(Conference.class);
query = query.filter(“city =", “London");
… і так багато фільтрів
Описание слайда:
Filter by Property Але ми можемо додавати фільтри до запиту. Ми можемо розбити створення Query Query query = ofy().load().type(Conference.class); query = query.filter(“city =", “London"); … і так багато фільтрів

Слайд 25





Filter by Property
Давайте додамо метод в Api, що буде повертати всі конференції, що створені в якомусь конкретному місті (наприклад London) і має конкретний топік 
@ApiMethod(
            name = "getConferencesFiltered",
            path = "getConferencesFiltered",
            httpMethod = HttpMethod.POST
    )
    public List<Conference> getConferencesFiltered(){
                
    Query query = ofy().load().type(Conference.class);
    query = query.filter("city =", "London");
    query = query.filter("topics =", "Web Technologies");
        return query.list();
    }
Описание слайда:
Filter by Property Давайте додамо метод в Api, що буде повертати всі конференції, що створені в якомусь конкретному місті (наприклад London) і має конкретний топік @ApiMethod( name = "getConferencesFiltered", path = "getConferencesFiltered", httpMethod = HttpMethod.POST ) public List<Conference> getConferencesFiltered(){ Query query = ofy().load().type(Conference.class); query = query.filter("city =", "London"); query = query.filter("topics =", "Web Technologies"); return query.list(); }

Слайд 26





Datastore Indexes
Описание слайда:
Datastore Indexes

Слайд 27





Datastore Indexes
Індекси в реляційних  базах даних пришвидшують запити по полях
В Datastore, якщо ви хочете робити запит по полю то поле має мати індекс
Описание слайда:
Datastore Indexes Індекси в реляційних базах даних пришвидшують запити по полях В Datastore, якщо ви хочете робити запит по полю то поле має мати індекс

Слайд 28





Datastore Indexes
Коли ви зберігаєте значення, Datastore зберігає відповідний ключ Entity
Описание слайда:
Datastore Indexes Коли ви зберігаєте значення, Datastore зберігає відповідний ключ Entity

Слайд 29





Datastore Indexes
Коли вам потрібно знайти всі Entity які мають поле City = London 
Datastore подивиться запис 
Conference/city/Paris і знайде всі відповідні Entity ключі
Описание слайда:
Datastore Indexes Коли вам потрібно знайти всі Entity які мають поле City = London Datastore подивиться запис Conference/city/Paris і знайде всі відповідні Entity ключі

Слайд 30





Size of INDEX tables
Описание слайда:
Size of INDEX tables

Слайд 31





Datastore Indexes
В великому застосуванні індекси можуть займати більше місця ніж самі дані
Тому вам дуже важливо визначитися за якими полями ви хочете вміти робити запити
За замовчанням всі поля індексуються, навіть якщо ви забули анотацію @Index
Але коли ми використовуємо Objectify відбувається навпаки, якщо поле не має анотації воно не індексується
Тому якщо ми вирішили, що поле має індексуватися ми обов’язково надаємо анотацію @Index
Якщо ми все таки хочемо, що б всі поля індексувалися, ми надаємо анотацію @Index класу і використовувати анотацію @UnIndex для полів, що треба виключити
Описание слайда:
Datastore Indexes В великому застосуванні індекси можуть займати більше місця ніж самі дані Тому вам дуже важливо визначитися за якими полями ви хочете вміти робити запити За замовчанням всі поля індексуються, навіть якщо ви забули анотацію @Index Але коли ми використовуємо Objectify відбувається навпаки, якщо поле не має анотації воно не індексується Тому якщо ми вирішили, що поле має індексуватися ми обов’язково надаємо анотацію @Index Якщо ми все таки хочемо, що б всі поля індексувалися, ми надаємо анотацію @Index класу і використовувати анотацію @UnIndex для полів, що треба виключити

Слайд 32





Composite Indexes
Ми розглянули звичайні індекси, а що ви скажете про наступний запит
Retrieve all Conferences
filter by CITY and TOPIC
sort by NAME
Звичайні індекси не можуть бути комбіновані для відповіді на такий запит
Поясніть мені чому?
Описание слайда:
Composite Indexes Ми розглянули звичайні індекси, а що ви скажете про наступний запит Retrieve all Conferences filter by CITY and TOPIC sort by NAME Звичайні індекси не можуть бути комбіновані для відповіді на такий запит Поясніть мені чому?

Слайд 33





Composite Indexes
Для відповіді на попередній запит нам потрібен індекс який буде містити різні варіанти поєднань
Це називається composite indexes
Такі індекси можна створити наступним чином:
додати INDEX до INDEX файлу
або
запустити застосування локально, зробити запит і система автоматично створить index файл, який ви потім зможете завантажити в хмару
Описание слайда:
Composite Indexes Для відповіді на попередній запит нам потрібен індекс який буде містити різні варіанти поєднань Це називається composite indexes Такі індекси можна створити наступним чином: додати INDEX до INDEX файлу або запустити застосування локально, зробити запит і система автоматично створить index файл, який ви потім зможете завантажити в хмару

Слайд 34





Composite Indexes
Без композитного індексу в вас не будуть працювати запити.
Якщо в вас все вірно налаштовано, то коли ви будете запускати своє локальне застосування, при першому ж складному запиті буде створюватися композитний індекс
Цей індекс зберігається в файл
target/conference-1.0/WEB-INF/appengine-generated/datastore-indexes-auto.xml
Цей файл буде залитий разом з вашим застосуванням в хмару і після цього в хмарі зможуть виконуватися ваші запити
Описание слайда:
Composite Indexes Без композитного індексу в вас не будуть працювати запити. Якщо в вас все вірно налаштовано, то коли ви будете запускати своє локальне застосування, при першому ж складному запиті буде створюватися композитний індекс Цей індекс зберігається в файл target/conference-1.0/WEB-INF/appengine-generated/datastore-indexes-auto.xml Цей файл буде залитий разом з вашим застосуванням в хмару і після цього в хмарі зможуть виконуватися ваші запити

Слайд 35





Composite Indexes
Якщо раптом в вас не створюється індекс, ви можете його вручну додати в цей файл
Він має наступний вигляд
<!-- Indices written at Wed, 7 Jan 2015 14:10:28 EET -->
<datastore-indexes>
<datastore-index kind="Conference" ancestor="false" source = "auto">
<property name="city" direction="asc"/>
<property name="maxAttendees" direction="asc"/>
</datastore-index>
<datastore-index kind="Conference" ancestor="false" source = "auto">
<property name="city" direction="asc"/>
<property name="maxAttendees" direction="asc"/>
<property name="name" direction="asc"/>
</datastore-index>
<datastore-index kind="Conference" ancestor="false" source = "auto">
<property name="city" direction="asc"/>
<property name="name" direction="asc"/>
</datastore-index>
<datastore-index kind="Conference" ancestor="false" source = "auto">
<property name="maxAttendees" direction="asc"/>
<property name="name" direction="asc"/>
</datastore-index>
</datastore-indexes>
Описание слайда:
Composite Indexes Якщо раптом в вас не створюється індекс, ви можете його вручну додати в цей файл Він має наступний вигляд <!-- Indices written at Wed, 7 Jan 2015 14:10:28 EET --> <datastore-indexes> <datastore-index kind="Conference" ancestor="false" source = "auto"> <property name="city" direction="asc"/> <property name="maxAttendees" direction="asc"/> </datastore-index> <datastore-index kind="Conference" ancestor="false" source = "auto"> <property name="city" direction="asc"/> <property name="maxAttendees" direction="asc"/> <property name="name" direction="asc"/> </datastore-index> <datastore-index kind="Conference" ancestor="false" source = "auto"> <property name="city" direction="asc"/> <property name="name" direction="asc"/> </datastore-index> <datastore-index kind="Conference" ancestor="false" source = "auto"> <property name="maxAttendees" direction="asc"/> <property name="name" direction="asc"/> </datastore-index> </datastore-indexes>

Слайд 36





Query Restrictions
Фільтр нерівності можна використовувати лише один раз
цей вираз не вірний
startdate > 15th June && maxattendees <1000
Властивість, що приймає участь в нерівності має бути відсортована першою
цей вираз не вірний
maxattendees < 1000 SORT BY NAME
Описание слайда:
Query Restrictions Фільтр нерівності можна використовувати лише один раз цей вираз не вірний startdate > 15th June && maxattendees <1000 Властивість, що приймає участь в нерівності має бути відсортована першою цей вираз не вірний maxattendees < 1000 SORT BY NAME

Слайд 37





Query Restrictions
Давайте допишемо один фільтр і запустимо.
Як ви думаєте, який буде результат?
@ApiMethod(
            name = "getConferencesFiltered",
            path = "getConferencesFiltered",
            httpMethod = HttpMethod.POST
    )
    public List<Conference> getConferencesFiltered(){
                
    Query query = ofy().load().type(Conference.class).order("name");
    query = query.filter("city =", "London");
    query = query.filter("topics =", "Web Technologies");
    query = query.filter("month =", 1);
    query = query.filter("maxAttendees >",10);
        return query.list();
    }
Описание слайда:
Query Restrictions Давайте допишемо один фільтр і запустимо. Як ви думаєте, який буде результат? @ApiMethod( name = "getConferencesFiltered", path = "getConferencesFiltered", httpMethod = HttpMethod.POST ) public List<Conference> getConferencesFiltered(){ Query query = ofy().load().type(Conference.class).order("name"); query = query.filter("city =", "London"); query = query.filter("topics =", "Web Technologies"); query = query.filter("month =", 1); query = query.filter("maxAttendees >",10); return query.list(); }

Слайд 38





Query Restrictions
Виправимо
@ApiMethod(
            name = "getConferencesFiltered",
            path = "getConferencesFiltered",
            httpMethod = HttpMethod.POST
    )
    public List<Conference> getConferencesFiltered(){
Query query = ofy().load().type(Conference.class);
query = query.filter("maxAttendees >",10) query = query.filter("city =", "London");
query = query.filter("topics =", "Web Technologies");
query = query.filter("month =", 1) .order("maxAttendees").order("name");
return query.list();    
}
Описание слайда:
Query Restrictions Виправимо @ApiMethod( name = "getConferencesFiltered", path = "getConferencesFiltered", httpMethod = HttpMethod.POST ) public List<Conference> getConferencesFiltered(){ Query query = ofy().load().type(Conference.class); query = query.filter("maxAttendees >",10) query = query.filter("city =", "London"); query = query.filter("topics =", "Web Technologies"); query = query.filter("month =", 1) .order("maxAttendees").order("name"); return query.list(); }

Слайд 39





Фільтр
Ви пам’ятаєте, що в нашому застосуванні є фільтр.
Ми з вами написали метод
public List<Conference> queryConferences() {
Query query = ofy().load().type(Conference.class).order("name");
return query.list();
}
Але він повертає всі конференції відсортовані за назвою
Якщо ми зараз запустимо застосування і спробуємо додавати фільтри, вони не будуть працювати
Нам потрібно доробити наш метод
Описание слайда:
Фільтр Ви пам’ятаєте, що в нашому застосуванні є фільтр. Ми з вами написали метод public List<Conference> queryConferences() { Query query = ofy().load().type(Conference.class).order("name"); return query.list(); } Але він повертає всі конференції відсортовані за назвою Якщо ми зараз запустимо застосування і спробуємо додавати фільтри, вони не будуть працювати Нам потрібно доробити наш метод

Слайд 40





Фільтр
В нас в додатках є файл  ConferenceQueryForm скопіюємо його в відповідний пакет
Дуже цікавий клас, я раджу його розібрати
Тепер ми можемо приймати в метод ConferenceQueryForm 
і замість існуючого коду вставити
public List<Conference> queryConferences(ConferenceQueryForm conferenceQueryForm ) {
return conferenceQueryForm.getQuery().list();
}
тепер ваші фільтри мають почати працювати
Описание слайда:
Фільтр В нас в додатках є файл ConferenceQueryForm скопіюємо його в відповідний пакет Дуже цікавий клас, я раджу його розібрати Тепер ми можемо приймати в метод ConferenceQueryForm і замість існуючого коду вставити public List<Conference> queryConferences(ConferenceQueryForm conferenceQueryForm ) { return conferenceQueryForm.getQuery().list(); } тепер ваші фільтри мають почати працювати

Слайд 41





Фільтр
Трохи оптимізації
public List queryConferences(ConferenceQueryForm conferenceQueryForm) { 
Iterable<Conference> conferenceIterable = conferenceQueryForm.getQuery(); 
List<Conference> result = new ArrayList<>(0); 
List<Key<Profile>> organizersKeyList = new ArrayList<>(0); 
for (Conference conference : conferenceIterable) { 
organizersKeyList.add(Key.create(Profile.class, conference.getOrganizerUserId())); 
result.add(conference); 
} 
// To avoid separate datastore gets for each Conference, pre-fetch the Profiles. 
ofy().load().keys(organizersKeyList); 
return result; 
}
Описание слайда:
Фільтр Трохи оптимізації public List queryConferences(ConferenceQueryForm conferenceQueryForm) { Iterable<Conference> conferenceIterable = conferenceQueryForm.getQuery(); List<Conference> result = new ArrayList<>(0); List<Key<Profile>> organizersKeyList = new ArrayList<>(0); for (Conference conference : conferenceIterable) { organizersKeyList.add(Key.create(Profile.class, conference.getOrganizerUserId())); result.add(conference); } // To avoid separate datastore gets for each Conference, pre-fetch the Profiles. ofy().load().keys(organizersKeyList); return result; }

Слайд 42





Datastore Commit Process
Datastore has two consistency models
eventual consistency
strong consistency
Описание слайда:
Datastore Commit Process Datastore has two consistency models eventual consistency strong consistency

Слайд 43





Datastore Commit Process
Eventual Consistency
Описание слайда:
Datastore Commit Process Eventual Consistency

Слайд 44





Datastore Commit Process
Strong Consistency
Описание слайда:
Datastore Commit Process Strong Consistency

Слайд 45





Eventual vs Strong
Яка стратегія краще підходить для ?
блог
АТМ money
Описание слайда:
Eventual vs Strong Яка стратегія краще підходить для ? блог АТМ money

Слайд 46





Eventual vs Strong
За замовчанням використовується Eventual consistency
Але якщо ви робите запит 
Ancestor relationship
Filter by ancestor
всі сини будуть видобуті використовуючи Strong consistency
Описание слайда:
Eventual vs Strong За замовчанням використовується Eventual consistency Але якщо ви робите запит Ancestor relationship Filter by ancestor всі сини будуть видобуті використовуючи Strong consistency

Слайд 47





Транзакції
В нашому випадку коли користувач реєструється на конференцію ми зв’язуємо конференцію і користувача
Описание слайда:
Транзакції В нашому випадку коли користувач реєструється на конференцію ми зв’язуємо конференцію і користувача

Слайд 48





Транзакції
В стандартному випадку наші запити виглядають наступним чином
Зазвичай цього достатньо, але бувають випадки …
Як ви думаєте, що це за випадки?
Описание слайда:
Транзакції В стандартному випадку наші запити виглядають наступним чином Зазвичай цього достатньо, але бувають випадки … Як ви думаєте, що це за випадки?

Слайд 49





Транзакції
Описание слайда:
Транзакції

Слайд 50





Транзакції
Описание слайда:
Транзакції

Слайд 51





Транзакції
Дана проблема може бути вирішена за допомогою транзакцій
Описание слайда:
Транзакції Дана проблема може бути вирішена за допомогою транзакцій

Слайд 52





Транзакції
Описание слайда:
Транзакції

Слайд 53





Транзакції
Давайте впровадимо транзакції в наше застосування
В нас поки, що не реалізована функція реєстрації на конференцію
Давайте зробимо це
Описание слайда:
Транзакції Давайте впровадимо транзакції в наше застосування В нас поки, що не реалізована функція реєстрації на конференцію Давайте зробимо це

Слайд 54





Реєстрація
При реєстрації на конференцію ми маємо зробити наступні речі
зареєструвати користувача на конференцію
зменшити кількість вільних місць
вирішити, що робити в конфліктній ситуації
вільне місце залишилося одне а претендентів декілька
вони одночасно роблять запит
Описание слайда:
Реєстрація При реєстрації на конференцію ми маємо зробити наступні речі зареєструвати користувача на конференцію зменшити кількість вільних місць вирішити, що робити в конфліктній ситуації вільне місце залишилося одне а претендентів декілька вони одночасно роблять запит

Слайд 55





Реєстрація
Спочатку ми змінимо профайл користувача і додамо поле, що буде відповідати за конференції на які підписався користувач
private List <String> conferenceKeysToAttend = new ArrayList<> (0);
Додамо методи
один має повертати копію списку конференцій на які записаний користувач
інший має додавати конференцію до списку
видалити конференцію з списку
Описание слайда:
Реєстрація Спочатку ми змінимо профайл користувача і додамо поле, що буде відповідати за конференції на які підписався користувач private List <String> conferenceKeysToAttend = new ArrayList<> (0); Додамо методи один має повертати копію списку конференцій на які записаний користувач інший має додавати конференцію до списку видалити конференцію з списку

Слайд 56





Реєстрація
Тепер нам необхідно додати методи в ConferenceApi
Їх заглушки знаходяться в додатку registerForConference-skeleton-and-other-additions.txt
@Named – ви маєте імпортувати import javax.inject.Named;
import com.google.api.server.spi.response.NotFoundException;
Описание слайда:
Реєстрація Тепер нам необхідно додати методи в ConferenceApi Їх заглушки знаходяться в додатку registerForConference-skeleton-and-other-additions.txt @Named – ви маєте імпортувати import javax.inject.Named; import com.google.api.server.spi.response.NotFoundException;

Слайд 57





Реєстрація
Майже весь код готовий, ви маєте реалізувати лише один метод registerForConference
Але що б його написати ви маєте розібратися з транзакціями
Описание слайда:
Реєстрація Майже весь код готовий, ви маєте реалізувати лише один метод registerForConference Але що б його написати ви маєте розібратися з транзакціями

Слайд 58





Реєстрація
Запуск транзакції
<T> result = ofy().transact(new Work <T> { 
public <T> run () { 
// do stuff 
// do more stuff 
return <T>; 
}
});
Описание слайда:
Реєстрація Запуск транзакції <T> result = ofy().transact(new Work <T> { public <T> run () { // do stuff // do more stuff return <T>; } });

Слайд 59





Transaction rules
Snapshot isolation
Optimistic concurency
Описание слайда:
Transaction rules Snapshot isolation Optimistic concurency

Слайд 60





Snapshot isolation
Всі запити на читання мають повертати значення які мало сховище до початку транзакції
Updates не будуть видимі ззовні
все або нічого
Описание слайда:
Snapshot isolation Всі запити на читання мають повертати значення які мало сховище до початку транзакції Updates не будуть видимі ззовні все або нічого

Слайд 61





Optimistic concurency

Commit може бути тільки успішним (всі дії успішні)
Значення, що отримують нове значення не мають бути змінені з моменту початку транзакціїї
до початку транзакції
а = 2
в ході вашої транзакції ви змінили а =6
коли ви пробуєте записати транзакцію, якщо а в базі не 2 ваша транзакція не відбудеться
Одна транзакція може модифікувати максимум 5 Ancestor Groups
Має бути завершена за 60 секунд
Описание слайда:
Optimistic concurency Commit може бути тільки успішним (всі дії успішні) Значення, що отримують нове значення не мають бути змінені з моменту початку транзакціїї до початку транзакції а = 2 в ході вашої транзакції ви змінили а =6 коли ви пробуєте записати транзакцію, якщо а в базі не 2 ваша транзакція не відбудеться Одна транзакція може модифікувати максимум 5 Ancestor Groups Має бути завершена за 60 секунд

Слайд 62





Конференції на які ми записані
Ми не реалізували ще одну річ
Ми не показуємо конференції на які зареєструвався користувач
Треба дописати і цей метод 
@ApiMethod(
            name = "getConferencesToAttend",
            path = "getConferencesToAttend",
            httpMethod = HttpMethod.GET
    )
    public Collection<Conference> getConferencesToAttend(final User user)
            throws UnauthorizedException, NotFoundException {
…
}
Описание слайда:
Конференції на які ми записані Ми не реалізували ще одну річ Ми не показуємо конференції на які зареєструвався користувач Треба дописати і цей метод @ApiMethod( name = "getConferencesToAttend", path = "getConferencesToAttend", httpMethod = HttpMethod.GET ) public Collection<Conference> getConferencesToAttend(final User user) throws UnauthorizedException, NotFoundException { … }

Слайд 63





Відписка
Також ми маємо дати можливість користувачу відписатися від конференції
Допишіть метод самостійно
Заглушка метода присутня в додатках
Описание слайда:
Відписка Також ми маємо дати можливість користувачу відписатися від конференції Допишіть метод самостійно Заглушка метода присутня в додатках

Слайд 64





unregisterFromConference
/**     
* Unregister from the specified Conference.     *     
* @param user An user who invokes this method, null when the user is not signed in.     
* @param websafeConferenceKey The String representation of the Conference Key to unregister  from.     
* @return Boolean true when success, otherwise false.     
* @throws UnauthorizedException when the user is not signed in.     
* @throws NotFoundException when there is no Conference with the given conferenceId.     
*/   
@ApiMethod( 
name = "unregisterFromConference", 
path = "conference/{websafeConferenceKey}/registration",
 httpMethod = HttpMethod.DELETE)    
public WrappedBoolean unregisterFromConference(
final User user, 
@Named("websafeConferenceKey") final String websafeConferenceKey
) throws UnauthorizedException, NotFoundException, ForbiddenException, ConflictException {
}
Описание слайда:
unregisterFromConference /** * Unregister from the specified Conference. * * @param user An user who invokes this method, null when the user is not signed in. * @param websafeConferenceKey The String representation of the Conference Key to unregister from. * @return Boolean true when success, otherwise false. * @throws UnauthorizedException when the user is not signed in. * @throws NotFoundException when there is no Conference with the given conferenceId. */ @ApiMethod( name = "unregisterFromConference", path = "conference/{websafeConferenceKey}/registration", httpMethod = HttpMethod.DELETE) public WrappedBoolean unregisterFromConference( final User user, @Named("websafeConferenceKey") final String websafeConferenceKey ) throws UnauthorizedException, NotFoundException, ForbiddenException, ConflictException { }

Слайд 65






Дякую за увагу
Описание слайда:
Дякую за увагу



Похожие презентации
Mypresentation.ru
Загрузить презентацию