воскресенье, 10 апреля 2016 г.

Cache': Где наши данные?

Как получить доступ к данным с нестандартным размещением через объектный и sql интерфейсы?
При работе с данными через прямой доступ имеется возможность указать, где они находятся, явным образом. При использовании же как объектного так и sql интерфейсов такой возможности не предусмотрено. Это можно сделать, используя задание правил размещения этих данных.

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

Возьмем из области SAMPLES класс Sample.Person и используемый им класс Sample.Address и экспортируем их в формате xml (я привожу выполнение примера на Cache версии 5.0.21) в отдельный файл. Сам файл приводить не стану - его легко получить самостоятельно.

Теперь импортируем эти классы в область USER без компиляции и перейдем к их редактированию в Cache Studio.

Класс Sample.Address оставляем без изменений, просто компилируем.

Открываем редактирование класса Sample.Person, в меню студии выбираем пункт Вид - Просмотр способа хранения. И переходим к описанию хранения данных. У меня это выглядит таким образом:
<Storage name="Default">
    <Data name="PersonDefaultData">
        <Value name="1">
            <Value>%%CLASSNAME</Value>
        </Value>
        <Value name="2">
            <Value>DOB</Value>
        </Value>
        <Value name="3">
            <Value>FavoriteColors</Value>
        </Value>
        <Value name="4">
            <Value>Home</Value>
        </Value>
        <Value name="5">
            <Value>Name</Value>
        </Value>
        <Value name="6">
            <Value>Office</Value>
        </Value>
        <Value name="7">
            <Value>SSN</Value>
        </Value>
        <Value name="8">
            <Value>Spouse</Value>
        </Value>
    </Data>
    <DataLocation>^Sample.PersonD</DataLocation>
    <DefaultData>PersonDefaultData</DefaultData>
    <IdLocation>^Sample.PersonD</IdLocation>
    <IndexLocation>^Sample.PersonI</IndexLocation>
    <SequenceNumber>25</SequenceNumber>
    <StreamLocation>^Sample.PersonS</StreamLocation>
    <Type>%Library.CacheStorage</Type>
</Storage>
Здесь описано какие атрибуты у класса есть, порядок и место их хранения. Наша задача указать, что данные лежат не в области USER, а в области SAMPLES. Для этого в описании хранения явно прописываем указание области в атрибутах DataLocation, IdLocation, IndexLocation, StreamLocation. У меня это получается таким образом:
<Storage name="Default">
    <Data name="PersonDefaultData">
        <Value name="1">
            <Value>%%CLASSNAME</Value>
        </Value>
        <Value name="2">
            <Value>DOB</Value>
        </Value>
        <Value name="3">
            <Value>FavoriteColors</Value>
        </Value>
        <Value name="4">
            <Value>Home</Value>
        </Value>
        <Value name="5">
            <Value>Name</Value>
        </Value>
        <Value name="6">
            <Value>Office</Value>
        </Value>
        <Value name="7">
            <Value>SSN</Value>
        </Value>
        <Value name="8">
            <Value>Spouse</Value>
        </Value>
    </Data>
    <DataLocation>^|"SAMPLES"|Sample.PersonD</DataLocation>
    <DefaultData>PersonDefaultData</DefaultData>
    <IdLocation>^|"SAMPLES"|Sample.PersonD</IdLocation>
    <IndexLocation>^|"SAMPLES"|Sample.PersonI</IndexLocation>
    <SequenceNumber>25</SequenceNumber>
    <StreamLocation>^|"SAMPLES"|Sample.PersonS</StreamLocation>
    <Type>%Library.CacheStorage</Type>
</Storage>
Компилируем класс. Получили, что в областях USER и SAMPLES есть одинаковые классы Sample.Person и Sample.Address, при этом в области USER данные указываются на область SAMPLES.

Можем открыть Cache SQL Manager, и в нем открыть таблицы в обеих областях. Таким образом, мы получили решение исходной задачи - имеем и объектный и sql доступ к данным в другой области.

Также возможно указывать в качестве области не константу, а вычисляемое выражение, или вместо глобали использовать локальные переменные. В этом случае можно организовать весьма хитроумные способы размещения. Но в каждом из них нужно детально анализировать, как поведет себя оптимизатор SQL, как будет относиться объектный движок Cache при сохранении объекта если место его хранения изменилось. Но эффекты могут оказаться не только сложными но и полезными с точки зрения прикладных решений.

Комментариев нет:

Отправить комментарий