summaryrefslogtreecommitdiffstats
path: root/common/datastorequery.h
blob: ea617802eae88ed56e2ab71ae666b1c228c0cf96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 *   Copyright (C) 2016 Christian Mollekopf <chrigi_1@fastmail.fm>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
 */
#pragma once

#include "query.h"
#include "storage.h"
#include "resultset.h"
#include "typeindex.h"
#include "query.h"
#include "entitybuffer.h"


class Source;
class FilterBase;

class DataStoreQuery {
    friend class FilterBase;
public:
    typedef QSharedPointer<DataStoreQuery> Ptr;

    DataStoreQuery(const Sink::Query &query, const QByteArray &type, Sink::Storage::Transaction &transaction, TypeIndex &typeIndex, std::function<QVariant(const Sink::Entity &entity, const QByteArray &property)> getProperty);
    ResultSet execute();
    ResultSet update(qint64 baseRevision);

protected:

    typedef std::function<bool(const QByteArray &uid, const Sink::EntityBuffer &entityBuffer)> FilterFunction;
    typedef std::function<void(const QByteArray &uid, const Sink::EntityBuffer &entityBuffer)> BufferCallback;

    virtual QVariant getProperty(const Sink::Entity &entity, const QByteArray &property);
    QVector<QByteArray> indexLookup(const QByteArray &property, const QVariant &value);

    virtual void readEntity(const QByteArray &key, const BufferCallback &resultCallback);

    /* virtual ResultSet loadInitialResultSet(QSet<QByteArray> &remainingFilters, QByteArray &remainingSorting); */
    /* virtual ResultSet loadIncrementalResultSet(qint64 baseRevision, QSet<QByteArray> &remainingFilters); */

    /* virtual ResultSet filterAndSortSet(ResultSet &resultSet, const FilterFunction &filter, const QByteArray &sortProperty); */
    /* virtual ResultSet postSortFilter(ResultSet &resultSet); */
    /* virtual FilterFunction getFilter(const QSet<QByteArray> &remainingFilters); */

    ResultSet createFilteredSet(ResultSet &resultSet, const std::function<bool(const QByteArray &, const Sink::EntityBuffer &buffer)> &);
    QVector<QByteArray> loadIncrementalResultSet(qint64 baseRevision);

    void setupQuery();

    Sink::Query mQuery;
    Sink::Storage::Transaction &mTransaction;
    const QByteArray mType;
    TypeIndex &mTypeIndex;
    Sink::Storage::NamedDatabase mDb;
    std::function<QVariant(const Sink::Entity &entity, const QByteArray &property)> mGetProperty;
    bool mInitialQuery;
    QSharedPointer<FilterBase> mCollector;
    QSharedPointer<Source> mSource;
};


class FilterBase {
public:
    typedef QSharedPointer<FilterBase> Ptr;
    FilterBase(DataStoreQuery *store)
        : mDatastore(store)
    {

    }

    FilterBase(FilterBase::Ptr source, DataStoreQuery *store)
        : mSource(source),
        mDatastore(store)
    {
    }

    virtual ~FilterBase(){}

    void readEntity(const QByteArray &key, const std::function<void(const QByteArray &, const Sink::EntityBuffer &buffer)> &callback)
    {
        Q_ASSERT(mDatastore);
        mDatastore->readEntity(key, callback);
    }

    QVariant getProperty(const Sink::Entity &entity, const QByteArray &property)
    {
        Q_ASSERT(mDatastore);
        return mDatastore->getProperty(entity, property);
    }

    QVector<QByteArray> indexLookup(const QByteArray &property, const QVariant &value)
    {
        Q_ASSERT(mDatastore);
        return mDatastore->indexLookup(property, value);
    }

    virtual void skip() { mSource->skip(); };

    //Returns true for as long as a result is available
    virtual bool next(const std::function<void(Sink::Operation operation, const QByteArray &uid, const Sink::EntityBuffer &entityBuffer)> &callback) = 0;

    QSharedPointer<FilterBase> mSource;
    DataStoreQuery *mDatastore;
};

/* class Reduce { */
/*     QByteArray property; */

/*     //Property - value, reduction result */
/*     QHash<QVariant, QVariant> mReducedValue; */
/* }; */

/* class Bloom { */
/*     QByteArray property; */

/*     //Property - value, reduction result */
/*     QSet<QVariant> mPropertyValues; */

/* }; */