Vladimir Ozerov created IGNITE-6195:
---------------------------------------
Summary: SQL: Do not allow JOINs on caches with different affinity
functions
Key: IGNITE-6195
URL: https://issues.apache.org/jira/browse/IGNITE-6195
Project: Ignite
Issue Type: Task
Components: sql
Affects Versions: 2.1
Reporter: Vladimir Ozerov
Fix For: 2.2
Currently it is possible to execute JOIN on non-colocated caches. No exceptions
will appear, user just receive incorrect result. We need to detect such
situations and throw errors instead.
*Proposed solution*
Correct SQL result is possible when either distributed joins are enabled, or
data is co-located properly. Under *proper* co-location we mean:
1) Participating {{PARTITIONED}} caches use the same affinity function
2) This affinity function doesn't depend on it's own previous state, i.e. it
doesn't rely on {{AffinityFunctionContext.previousAssignment}}. For instance,
{{RendezvousAffinityFunction}} doesn't use, while {{FairAffinityFunction}} does.
As such, the following procedure should be implemented in order to determine
whether SQL can be executed:
1) If {{distributedJoins}} are enabled - return, SQL can be executed
2) Get the list of participating caches
3) Exclude {{REPLICATED}} caches from that list
4) If all remaining caches belong to the same cache group - return, SQL can be
executed
5) Get affinity function of the first cache
6) Check if affinity function doesn't use
{{AffinityFunctionContext.previousAssignment}}. This could be controlled either
through annotation, or through new method on {{AffinityFunction}} interface,
e.g. {{boolean isDependOnPreviousState}}. If {{false}} - throw an exception
7) Check if affinity functions of all caches are equal through standard
{{equals()}} method. If {{false}} - throw an exception.
8) Otherwise - SQL can be executed safely.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)