Browse Source
- Adding the JSON table type
- Adding the JSON table type
added: storage/connect/json.cpp storage/connect/json.h storage/connect/mysql-test/connect/r/json.result storage/connect/mysql-test/connect/std_data/biblio.jsn storage/connect/mysql-test/connect/std_data/expense.jsn storage/connect/mysql-test/connect/std_data/mulexp3.jsn storage/connect/mysql-test/connect/std_data/mulexp4.jsn storage/connect/mysql-test/connect/std_data/mulexp5.jsn storage/connect/mysql-test/connect/t/json.test storage/connect/tabjson.cpp storage/connect/tabjson.h modified: storage/connect/CMakeLists.txt storage/connect/engmsg.h storage/connect/filamtxt.h storage/connect/ha_connect.cc storage/connect/msgid.h storage/connect/mycat.cc storage/connect/plgdbsem.h storage/connect/tabdos.cpp storage/connect/value.cpp storage/connect/value.hpull/22/head
21 changed files with 3962 additions and 50 deletions
-
14storage/connect/CMakeLists.txt
-
5storage/connect/engmsg.h
-
1storage/connect/filamtxt.h
-
6storage/connect/ha_connect.cc
-
1055storage/connect/json.cpp
-
240storage/connect/json.h
-
5storage/connect/msgid.h
-
10storage/connect/mycat.cc
-
439storage/connect/mysql-test/connect/r/json.result
-
45storage/connect/mysql-test/connect/std_data/biblio.jsn
-
158storage/connect/mysql-test/connect/std_data/expense.jsn
-
52storage/connect/mysql-test/connect/std_data/mulexp3.jsn
-
52storage/connect/mysql-test/connect/std_data/mulexp4.jsn
-
52storage/connect/mysql-test/connect/std_data/mulexp5.jsn
-
247storage/connect/mysql-test/connect/t/json.test
-
11storage/connect/plgdbsem.h
-
3storage/connect/tabdos.cpp
-
1327storage/connect/tabjson.cpp
-
197storage/connect/tabjson.h
-
87storage/connect/value.cpp
-
6storage/connect/value.h
1055
storage/connect/json.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,240 @@ |
|||
/**************** json H Declares Source Code File (.H) ****************/ |
|||
/* Name: json.h Version 1.0 */ |
|||
/* */ |
|||
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ |
|||
/* */ |
|||
/* This file contains the JSON classes declares. */ |
|||
/***********************************************************************/ |
|||
#include "value.h" |
|||
|
|||
#if defined(_DEBUG) |
|||
#define X assert(false); |
|||
#else |
|||
#define X |
|||
#endif |
|||
|
|||
enum JTYP {TYPE_JSON = 12, TYPE_JAR, TYPE_JOB, TYPE_JVAL}; |
|||
|
|||
class JOUT; |
|||
class JSON; |
|||
class JMAP; |
|||
class JVALUE; |
|||
class JOBJECT; |
|||
class JARRAY; |
|||
|
|||
typedef class JPAIR *PJPR; |
|||
typedef class JSON *PJSON; |
|||
typedef class JVALUE *PJVAL; |
|||
typedef class JOBJECT *PJOB; |
|||
typedef class JARRAY *PJAR; |
|||
|
|||
typedef struct { |
|||
char *str; |
|||
int len; |
|||
} STRG, *PSG; |
|||
|
|||
PJSON ParseJson(PGLOBAL g, char *s, int n, int prty, bool *b = NULL); |
|||
PJAR ParseArray(PGLOBAL g, int& i, STRG& src); |
|||
PJOB ParseObject(PGLOBAL g, int& i, STRG& src); |
|||
PJVAL ParseValue(PGLOBAL g, int& i, STRG& src); |
|||
char *ParseString(PGLOBAL g, int& i, STRG& src); |
|||
PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src); |
|||
PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty); |
|||
bool SerializeArray(JOUT *js, PJAR jarp, bool b); |
|||
bool SerializeObject(JOUT *js, PJOB jobp); |
|||
bool SerializeValue(JOUT *js, PJVAL jvp); |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JOUT. Used by Serialize. */ |
|||
/***********************************************************************/ |
|||
class JOUT : public BLOCK { |
|||
public: |
|||
JOUT(PGLOBAL gp) : BLOCK() {g = gp;} |
|||
|
|||
virtual bool Write(char *s) = 0; |
|||
virtual bool Write(char c) = 0; |
|||
virtual bool Escape(char *s) = 0; |
|||
|
|||
// Member |
|||
PGLOBAL g; |
|||
}; // end of class JOUT |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JOUTSTR. Used to Serialize to a string. */ |
|||
/***********************************************************************/ |
|||
class JOUTSTR : public JOUT { |
|||
public: |
|||
JOUTSTR(PGLOBAL g); |
|||
|
|||
virtual bool Write(char *s); |
|||
virtual bool Write(char c); |
|||
virtual bool Escape(char *s); |
|||
|
|||
// Member |
|||
char *Strp; // The serialized string |
|||
size_t N; // Position of next char |
|||
size_t Max; // String max size |
|||
}; // end of class JOUTSTR |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JOUTFILE. Used to Serialize to a file. */ |
|||
/***********************************************************************/ |
|||
class JOUTFILE : public JOUT { |
|||
public: |
|||
JOUTFILE(PGLOBAL g, FILE *str) : JOUT(g) {Stream = str;} |
|||
|
|||
virtual bool Write(char *s); |
|||
virtual bool Write(char c); |
|||
virtual bool Escape(char *s); |
|||
|
|||
// Member |
|||
FILE *Stream; |
|||
}; // end of class JOUTFILE |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JOUTPRT. Used to Serialize to a pretty file. */ |
|||
/***********************************************************************/ |
|||
class JOUTPRT : public JOUTFILE { |
|||
public: |
|||
JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str) {M = 0; B = false;} |
|||
|
|||
virtual bool Write(char *s); |
|||
virtual bool Write(char c); |
|||
|
|||
// Member |
|||
int M; |
|||
bool B; |
|||
}; // end of class JOUTPRT |
|||
|
|||
/***********************************************************************/ |
|||
/* Class PAIR. The pairs of a json Object. */ |
|||
/***********************************************************************/ |
|||
class JPAIR : public BLOCK { |
|||
friend class JOBJECT; |
|||
friend PJOB ParseObject(PGLOBAL, int&, STRG&); |
|||
friend bool SerializeObject(JOUT *, PJOB); |
|||
public: |
|||
JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} |
|||
|
|||
protected: |
|||
PSZ Key; // This pair key name |
|||
PJVAL Val; // To the value of the pair |
|||
PJPR Next; // To the next pair |
|||
}; // end of class JPAIR |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JSON. The base class for all other json classes. */ |
|||
/***********************************************************************/ |
|||
class JSON : public BLOCK { |
|||
public: |
|||
JSON(void) {Size = 0;} |
|||
|
|||
int size(void) {return Size;} |
|||
virtual void Clear(void) {Size = 0;} |
|||
virtual JTYP GetType(void) {return TYPE_JSON;} |
|||
virtual JTYP GetValType(void) {X return TYPE_JSON;} |
|||
virtual void InitArray(PGLOBAL g) {X} |
|||
virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL) {X return NULL;} |
|||
virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} |
|||
virtual PJVAL GetValue(const char *key) {X return NULL;} |
|||
virtual PJOB GetObject(void) {X return NULL;} |
|||
virtual PJAR GetArray(void) {X return NULL;} |
|||
virtual PJVAL GetValue(int i) {X return NULL;} |
|||
virtual PVAL GetValue(void) {X return NULL;} |
|||
virtual PJSON GetJson(void) {X return NULL;} |
|||
virtual int GetInteger(void) {X return 0;} |
|||
virtual double GetFloat() {X return 0.0;} |
|||
virtual PSZ GetString() {X return NULL;} |
|||
virtual PSZ GetText(PGLOBAL g) {X return NULL;} |
|||
virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) {X return true;} |
|||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} |
|||
virtual void SetValue(PVAL valp) {X} |
|||
virtual void SetValue(PJSON jsp) {X} |
|||
virtual bool DeleteValue(int i) {X return true;} |
|||
|
|||
protected: |
|||
int Size; |
|||
}; // end of class JSON |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JOBJECT: contains a list of value pairs. */ |
|||
/***********************************************************************/ |
|||
class JOBJECT : public JSON { |
|||
friend PJOB ParseObject(PGLOBAL, int&, STRG&); |
|||
friend bool SerializeObject(JOUT *, PJOB); |
|||
public: |
|||
JOBJECT(void) : JSON() {First = Last = NULL;} |
|||
|
|||
virtual void Clear(void) {First = Last = NULL; Size = 0;} |
|||
virtual JTYP GetType(void) {return TYPE_JOB;} |
|||
virtual PJPR AddPair(PGLOBAL g, PSZ key); |
|||
virtual PJOB GetObject(void) {return this;} |
|||
virtual PJVAL GetValue(const char* key); |
|||
virtual PSZ GetText(PGLOBAL g); |
|||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); |
|||
|
|||
protected: |
|||
PJPR First; |
|||
PJPR Last; |
|||
}; // end of class JOBJECT |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JARRAY. */ |
|||
/***********************************************************************/ |
|||
class JARRAY : public JSON { |
|||
friend PJAR ParseArray(PGLOBAL, int&, STRG&); |
|||
public: |
|||
JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;} |
|||
|
|||
virtual void Clear(void) {First = Last = NULL; Size = 0;} |
|||
virtual JTYP GetType(void) {return TYPE_JAR;} |
|||
virtual PJAR GetArray(void) {return this;} |
|||
virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL); |
|||
virtual void InitArray(PGLOBAL g); |
|||
virtual PJVAL GetValue(int i); |
|||
virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); |
|||
virtual bool DeleteValue(int n); |
|||
|
|||
protected: |
|||
// Members |
|||
int Alloc; // The Mvals allocated size |
|||
PJVAL First; // Used when constructing |
|||
PJVAL Last; // Last constructed value |
|||
PJVAL *Mvals; // Allocated when finished |
|||
}; // end of class JARRAY |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JVALUE. */ |
|||
/***********************************************************************/ |
|||
class JVALUE : public JSON { |
|||
friend class JARRAY; |
|||
friend PJVAL ParseValue(PGLOBAL, int&, STRG&); |
|||
friend bool SerializeValue(JOUT *, PJVAL); |
|||
public: |
|||
JVALUE(void) : JSON() |
|||
{Jsp = NULL; Value = NULL; Next = NULL; Del = false;} |
|||
JVALUE(PJSON jsp) : JSON() |
|||
{Jsp = jsp; Value = NULL; Next = NULL; Del = false;} |
|||
JVALUE(PGLOBAL g, PVAL valp); |
|||
|
|||
virtual void Clear(void) |
|||
{Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 0;} |
|||
virtual JTYP GetType(void) {return TYPE_JVAL;} |
|||
virtual JTYP GetValType(void); |
|||
virtual PJOB GetObject(void); |
|||
virtual PJAR GetArray(void); |
|||
virtual PVAL GetValue(void) {return Value;} |
|||
virtual PJSON GetJson(void) {return (Jsp ? Jsp : this);} |
|||
virtual int GetInteger(void); |
|||
virtual double GetFloat(void); |
|||
virtual PSZ GetString(void); |
|||
virtual void SetValue(PVAL valp) {Value = valp;} |
|||
virtual void SetValue(PJSON jsp) {Jsp = jsp;} |
|||
|
|||
protected: |
|||
PJSON Jsp; // To the json value |
|||
PVAL Value; // The numeric value |
|||
PJVAL Next; // Next value in array |
|||
bool Del; // True when deleted |
|||
}; // end of class JVALUE |
|||
|
|||
@ -0,0 +1,439 @@ |
|||
# |
|||
# Testing doc samples |
|||
# |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
LANG CHAR(2), |
|||
SUBJECT CHAR(32), |
|||
AUTHOR CHAR(64), |
|||
TITLE CHAR(32), |
|||
TRANSLATION CHAR(32), |
|||
TRANSLATOR CHAR(80), |
|||
PUBLISHER CHAR(32), |
|||
DATEPUB int(4) |
|||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
ISBN LANG SUBJECT AUTHOR TITLE TRANSLATION TRANSLATOR PUBLISHER DATEPUB |
|||
9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 |
|||
9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 |
|||
DROP TABLE t1; |
|||
# |
|||
# Testing Jpath. Get the number of authors |
|||
# |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
Language CHAR(2) FIELD_FORMAT='LANG', |
|||
Subject CHAR(32) FIELD_FORMAT='SUBJECT', |
|||
Authors INT(2) FIELD_FORMAT='AUTHOR:[#]', |
|||
Title CHAR(32) FIELD_FORMAT='TITLE', |
|||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION', |
|||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', |
|||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', |
|||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', |
|||
Year int(4) FIELD_FORMAT='DATEPUB' |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
ISBN Language Subject Authors Title Translation Translator Publisher Location Year |
|||
9782212090819 fr applications 2 Construire une application XML Eyrolles Paris 1999 |
|||
9782840825685 fr applications 1 XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 |
|||
DROP TABLE t1; |
|||
# |
|||
# Concatenates the authors |
|||
# |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
Language CHAR(2) FIELD_FORMAT='LANG', |
|||
Subject CHAR(32) FIELD_FORMAT='SUBJECT', |
|||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME', |
|||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME', |
|||
Title CHAR(32) FIELD_FORMAT='TITLE', |
|||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION', |
|||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', |
|||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', |
|||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', |
|||
Year int(4) FIELD_FORMAT='DATEPUB' |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year |
|||
9782212090819 fr applications Jean-Christophe and François Bernadac and Knab Construire une application XML Eyrolles Paris 1999 |
|||
9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 |
|||
DROP TABLE t1; |
|||
# |
|||
# Testing expanding authors |
|||
# |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
Language CHAR(2) FIELD_FORMAT='LANG', |
|||
Subject CHAR(32) FIELD_FORMAT='SUBJECT', |
|||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', |
|||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', |
|||
Title CHAR(32) FIELD_FORMAT='TITLE', |
|||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION', |
|||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', |
|||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', |
|||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', |
|||
Year int(4) FIELD_FORMAT='DATEPUB' |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year |
|||
9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 |
|||
9782212090819 fr applications François Knab Construire une application XML Eyrolles Paris 1999 |
|||
9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 |
|||
UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; |
|||
SELECT * FROM t1 WHERE ISBN = '9782212090819'; |
|||
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year |
|||
9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 |
|||
9782212090819 fr applications Philippe Knab Construire une application XML Eyrolles Paris 1999 |
|||
# |
|||
# To add an author a new table must be created |
|||
# |
|||
CREATE TABLE t2 ( |
|||
FIRSTNAME CHAR(32), |
|||
LASTNAME CHAR(32)) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn' OPTION_LIST='Object=[2]:AUTHOR'; |
|||
SELECT * FROM t2; |
|||
FIRSTNAME LASTNAME |
|||
William J. Pardi |
|||
INSERT INTO t2 VALUES('Charles','Dickens'); |
|||
SELECT * FROM t1; |
|||
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year |
|||
9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 |
|||
9782212090819 fr applications Philippe Knab Construire une application XML Eyrolles Paris 1999 |
|||
9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 |
|||
9782840825685 fr applications Charles Dickens XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 |
|||
DROP TABLE t1; |
|||
DROP TABLE t2; |
|||
# |
|||
# Check the biblio file has the good format |
|||
# |
|||
CREATE TABLE t1 |
|||
( |
|||
line char(255) |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
line |
|||
[ |
|||
{ |
|||
"ISBN": "9782212090819", |
|||
"LANG": "fr", |
|||
"SUBJECT": "applications", |
|||
"AUTHOR": [ |
|||
{ |
|||
"FIRSTNAME": "Jean-Christophe", |
|||
"LASTNAME": "Bernadac" |
|||
}, |
|||
{ |
|||
"FIRSTNAME": "Philippe", |
|||
"LASTNAME": "Knab" |
|||
} |
|||
], |
|||
"TITLE": "Construire une application XML", |
|||
"PUBLISHER": { |
|||
"NAME": "Eyrolles", |
|||
"PLACE": "Paris" |
|||
}, |
|||
"DATEPUB": 1999 |
|||
}, |
|||
{ |
|||
"ISBN": "9782840825685", |
|||
"LANG": "fr", |
|||
"SUBJECT": "applications", |
|||
"AUTHOR": [ |
|||
{ |
|||
"FIRSTNAME": "William J.", |
|||
"LASTNAME": "Pardi" |
|||
}, |
|||
{ |
|||
"FIRSTNAME": "Charles", |
|||
"LASTNAME": "Dickens" |
|||
} |
|||
], |
|||
"TITLE": "XML en Action", |
|||
"TRANSLATION": "adapté de l'anglais par", |
|||
"TRANSLATOR": { |
|||
"FIRSTNAME": "James", |
|||
"LASTNAME": "Guerin" |
|||
}, |
|||
"PUBLISHER": { |
|||
"NAME": "Microsoft Press", |
|||
"PLACE": "Paris" |
|||
}, |
|||
"DATEPUB": 1999 |
|||
} |
|||
] |
|||
DROP TABLE t1; |
|||
# |
|||
# A file with 2 arrays |
|||
# |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t1; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 3 Beer+Food+Food+Car 69.00 |
|||
Joe 4 Beer+Beer+Food+Food+Beer 83.00 |
|||
Joe 5 Beer+Food 26.00 |
|||
Beth 3 Beer 16.00 |
|||
Beth 4 Food+Beer 32.00 |
|||
Beth 5 Food+Beer 32.00 |
|||
Janet 3 Car+Food+Beer 55.00 |
|||
Janet 4 Car 17.00 |
|||
Janet 5 Beer+Car+Beer+Food 57.00 |
|||
DROP TABLE t1; |
|||
# |
|||
# Cannot be fully expanded |
|||
# |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t1; |
|||
ERROR HY000: Got error 174 'Cannot expand more than one array' from CONNECT |
|||
DROP TABLE t1; |
|||
# |
|||
# Expand expense in 3 one week tables |
|||
# |
|||
CREATE TABLE t2 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t2; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 3 Beer 18.00 |
|||
Joe 3 Food 12.00 |
|||
Joe 3 Food 19.00 |
|||
Joe 3 Car 20.00 |
|||
Beth 3 Beer 16.00 |
|||
Janet 3 Car 19.00 |
|||
Janet 3 Food 18.00 |
|||
Janet 3 Beer 18.00 |
|||
CREATE TABLE t3 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t3; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 4 Beer 19.00 |
|||
Joe 4 Beer 16.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Beer 14.00 |
|||
Beth 4 Food 17.00 |
|||
Beth 4 Beer 15.00 |
|||
Janet 4 Car 17.00 |
|||
CREATE TABLE t4 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t4; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 5 Beer 14.00 |
|||
Joe 5 Food 12.00 |
|||
Beth 5 Food 12.00 |
|||
Beth 5 Beer 20.00 |
|||
Janet 5 Beer 14.00 |
|||
Janet 5 Car 12.00 |
|||
Janet 5 Beer 19.00 |
|||
Janet 5 Food 12.00 |
|||
# |
|||
# The expanded table is made as a TBL table |
|||
# |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32), |
|||
AMOUNT DOUBLE(8,2)) |
|||
ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t2,t3,t4'; |
|||
SELECT * FROM t1; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 3 Beer 18.00 |
|||
Joe 3 Food 12.00 |
|||
Joe 3 Food 19.00 |
|||
Joe 3 Car 20.00 |
|||
Beth 3 Beer 16.00 |
|||
Janet 3 Car 19.00 |
|||
Janet 3 Food 18.00 |
|||
Janet 3 Beer 18.00 |
|||
Joe 4 Beer 19.00 |
|||
Joe 4 Beer 16.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Beer 14.00 |
|||
Beth 4 Food 17.00 |
|||
Beth 4 Beer 15.00 |
|||
Janet 4 Car 17.00 |
|||
Joe 5 Beer 14.00 |
|||
Joe 5 Food 12.00 |
|||
Beth 5 Food 12.00 |
|||
Beth 5 Beer 20.00 |
|||
Janet 5 Beer 14.00 |
|||
Janet 5 Car 12.00 |
|||
Janet 5 Beer 19.00 |
|||
Janet 5 Food 12.00 |
|||
DROP TABLE t1, t2, t3, t4; |
|||
# |
|||
# Three partial JSON tables |
|||
# |
|||
CREATE TABLE t2 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.jsn'; |
|||
SELECT * FROM t2; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 3 Beer 18.00 |
|||
Joe 3 Food 12.00 |
|||
Joe 3 Food 19.00 |
|||
Joe 3 Car 20.00 |
|||
Beth 3 Beer 16.00 |
|||
Janet 3 Car 19.00 |
|||
Janet 3 Food 18.00 |
|||
Janet 3 Beer 18.00 |
|||
CREATE TABLE t3 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.jsn'; |
|||
SELECT * FROM t3; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 4 Beer 19.00 |
|||
Joe 4 Beer 16.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Beer 14.00 |
|||
Beth 4 Food 17.00 |
|||
Beth 4 Beer 15.00 |
|||
Janet 4 Car 17.00 |
|||
CREATE TABLE t4 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.jsn'; |
|||
SELECT * FROM t4; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 5 Beer 14.00 |
|||
Joe 5 Food 12.00 |
|||
Beth 5 Food 12.00 |
|||
Beth 5 Beer 20.00 |
|||
Janet 5 Beer 14.00 |
|||
Janet 5 Car 12.00 |
|||
Janet 5 Beer 19.00 |
|||
Janet 5 Food 12.00 |
|||
# |
|||
# The complete table can be a multiple JSON table |
|||
# |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.jsn' MULTIPLE=1; |
|||
SELECT * FROM t1; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 3 Beer 18.00 |
|||
Joe 3 Food 12.00 |
|||
Joe 3 Food 19.00 |
|||
Joe 3 Car 20.00 |
|||
Beth 3 Beer 16.00 |
|||
Janet 3 Car 19.00 |
|||
Janet 3 Food 18.00 |
|||
Janet 3 Beer 18.00 |
|||
Joe 4 Beer 19.00 |
|||
Joe 4 Beer 16.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Beer 14.00 |
|||
Beth 4 Food 17.00 |
|||
Beth 4 Beer 15.00 |
|||
Janet 4 Car 17.00 |
|||
Joe 5 Beer 14.00 |
|||
Joe 5 Food 12.00 |
|||
Beth 5 Food 12.00 |
|||
Beth 5 Beer 20.00 |
|||
Janet 5 Beer 14.00 |
|||
Janet 5 Car 12.00 |
|||
Janet 5 Beer 19.00 |
|||
Janet 5 Food 12.00 |
|||
DROP TABLE t1; |
|||
# |
|||
# Or also a partition JSON table |
|||
# |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.jsn'; |
|||
ALTER TABLE t1 |
|||
PARTITION BY LIST COLUMNS(WEEK) ( |
|||
PARTITION `3` VALUES IN(3), |
|||
PARTITION `4` VALUES IN(4), |
|||
PARTITION `5` VALUES IN(5)); |
|||
Warnings: |
|||
Warning 1105 Data repartition in 3 is unchecked |
|||
Warning 1105 Data repartition in 4 is unchecked |
|||
Warning 1105 Data repartition in 5 is unchecked |
|||
SHOW WARNINGS; |
|||
Level Code Message |
|||
Warning 1105 Data repartition in 3 is unchecked |
|||
Warning 1105 Data repartition in 4 is unchecked |
|||
Warning 1105 Data repartition in 5 is unchecked |
|||
SELECT * FROM t1; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 3 Beer 18.00 |
|||
Joe 3 Food 12.00 |
|||
Joe 3 Food 19.00 |
|||
Joe 3 Car 20.00 |
|||
Beth 3 Beer 16.00 |
|||
Janet 3 Car 19.00 |
|||
Janet 3 Food 18.00 |
|||
Janet 3 Beer 18.00 |
|||
Joe 4 Beer 19.00 |
|||
Joe 4 Beer 16.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Beer 14.00 |
|||
Beth 4 Food 17.00 |
|||
Beth 4 Beer 15.00 |
|||
Janet 4 Car 17.00 |
|||
Joe 5 Beer 14.00 |
|||
Joe 5 Food 12.00 |
|||
Beth 5 Food 12.00 |
|||
Beth 5 Beer 20.00 |
|||
Janet 5 Beer 14.00 |
|||
Janet 5 Car 12.00 |
|||
Janet 5 Beer 19.00 |
|||
Janet 5 Food 12.00 |
|||
SELECT * FROM t1 WHERE WEEK = 4; |
|||
WHO WEEK WHAT AMOUNT |
|||
Joe 4 Beer 19.00 |
|||
Joe 4 Beer 16.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Food 17.00 |
|||
Joe 4 Beer 14.00 |
|||
Beth 4 Food 17.00 |
|||
Beth 4 Beer 15.00 |
|||
Janet 4 Car 17.00 |
|||
DROP TABLE t1, t2, t3, t4; |
|||
@ -0,0 +1,45 @@ |
|||
[ |
|||
{ |
|||
"ISBN": "9782212090819", |
|||
"LANG": "fr", |
|||
"SUBJECT": "applications", |
|||
"AUTHOR": [ |
|||
{ |
|||
"FIRSTNAME": "Jean-Christophe", |
|||
"LASTNAME": "Bernadac" |
|||
}, |
|||
{ |
|||
"FIRSTNAME": "François", |
|||
"LASTNAME": "Knab" |
|||
} |
|||
], |
|||
"TITLE": "Construire une application XML", |
|||
"PUBLISHER": { |
|||
"NAME": "Eyrolles", |
|||
"PLACE": "Paris" |
|||
}, |
|||
"DATEPUB": 1999 |
|||
}, |
|||
{ |
|||
"ISBN": "9782840825685", |
|||
"LANG": "fr", |
|||
"SUBJECT": "applications", |
|||
"AUTHOR": [ |
|||
{ |
|||
"FIRSTNAME": "William J.", |
|||
"LASTNAME": "Pardi" |
|||
} |
|||
], |
|||
"TITLE": "XML en Action", |
|||
"TRANSLATION": "adapté de l'anglais par", |
|||
"TRANSLATOR": { |
|||
"FIRSTNAME": "James", |
|||
"LASTNAME": "Guerin" |
|||
}, |
|||
"PUBLISHER": { |
|||
"NAME": "Microsoft Press", |
|||
"PLACE": "Paris" |
|||
}, |
|||
"DATEPUB": 1999 |
|||
} |
|||
] |
|||
@ -0,0 +1,158 @@ |
|||
[ |
|||
{ |
|||
"WHO": "Joe", |
|||
"WEEK": [ |
|||
{ |
|||
"NUMBER": 3, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 18.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 20.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"NUMBER": 4, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 16.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 17.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 17.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 14.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"NUMBER": 5, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 14.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
} |
|||
] |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Beth", |
|||
"WEEK": [ |
|||
{ |
|||
"NUMBER": 3, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 16.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"NUMBER": 4, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 17.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 15.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"NUMBER": 5, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 20.00 |
|||
} |
|||
] |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Janet", |
|||
"WEEK": [ |
|||
{ |
|||
"NUMBER": 3, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 18.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 18.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"NUMBER": 4, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 17.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"NUMBER": 5, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 14.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 12.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
} |
|||
] |
|||
} |
|||
] |
|||
} |
|||
] |
|||
@ -0,0 +1,52 @@ |
|||
[ |
|||
{ |
|||
"WHO": "Joe", |
|||
"WEEK": 3, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 18.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 20.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Beth", |
|||
"WEEK": 3, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 16.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Janet", |
|||
"WEEK": 3, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 18.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 18.00 |
|||
} |
|||
] |
|||
} |
|||
] |
|||
@ -0,0 +1,52 @@ |
|||
[ |
|||
{ |
|||
"WHO": "Joe", |
|||
"WEEK": 4, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 16.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 17.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 17.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 14.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Beth", |
|||
"WEEK": 4, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 17.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 15.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Janet", |
|||
"WEEK": 4, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 17.00 |
|||
} |
|||
] |
|||
} |
|||
] |
|||
@ -0,0 +1,52 @@ |
|||
[ |
|||
{ |
|||
"WHO": "Joe", |
|||
"WEEK": 5, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 14.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Beth", |
|||
"WEEK": 5, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 20.00 |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
"WHO": "Janet", |
|||
"WEEK": 5, |
|||
"EXPENSE": [ |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 14.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Car", |
|||
"AMOUNT": 12.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Beer", |
|||
"AMOUNT": 19.00 |
|||
}, |
|||
{ |
|||
"WHAT": "Food", |
|||
"AMOUNT": 12.00 |
|||
} |
|||
] |
|||
} |
|||
] |
|||
@ -0,0 +1,247 @@ |
|||
--source include/not_embedded.inc |
|||
--source include/have_partition.inc |
|||
|
|||
let $MYSQLD_DATADIR= `select @@datadir`; |
|||
|
|||
--copy_file $MTR_SUITE_DIR/std_data/biblio.jsn $MYSQLD_DATADIR/test/biblio.jsn |
|||
--copy_file $MTR_SUITE_DIR/std_data/expense.jsn $MYSQLD_DATADIR/test/expense.jsn |
|||
--copy_file $MTR_SUITE_DIR/std_data/mulexp3.jsn $MYSQLD_DATADIR/test/mulexp3.jsn |
|||
--copy_file $MTR_SUITE_DIR/std_data/mulexp4.jsn $MYSQLD_DATADIR/test/mulexp4.jsn |
|||
--copy_file $MTR_SUITE_DIR/std_data/mulexp5.jsn $MYSQLD_DATADIR/test/mulexp5.jsn |
|||
|
|||
--echo # |
|||
--echo # Testing doc samples |
|||
--echo # |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
LANG CHAR(2), |
|||
SUBJECT CHAR(32), |
|||
AUTHOR CHAR(64), |
|||
TITLE CHAR(32), |
|||
TRANSLATION CHAR(32), |
|||
TRANSLATOR CHAR(80), |
|||
PUBLISHER CHAR(32), |
|||
DATEPUB int(4) |
|||
) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
|
|||
--echo # |
|||
--echo # Testing Jpath. Get the number of authors |
|||
--echo # |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
Language CHAR(2) FIELD_FORMAT='LANG', |
|||
Subject CHAR(32) FIELD_FORMAT='SUBJECT', |
|||
Authors INT(2) FIELD_FORMAT='AUTHOR:[#]', |
|||
Title CHAR(32) FIELD_FORMAT='TITLE', |
|||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION', |
|||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', |
|||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', |
|||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', |
|||
Year int(4) FIELD_FORMAT='DATEPUB' |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
--echo # |
|||
--echo # Concatenates the authors |
|||
--echo # |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
Language CHAR(2) FIELD_FORMAT='LANG', |
|||
Subject CHAR(32) FIELD_FORMAT='SUBJECT', |
|||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME', |
|||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME', |
|||
Title CHAR(32) FIELD_FORMAT='TITLE', |
|||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION', |
|||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', |
|||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', |
|||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', |
|||
Year int(4) FIELD_FORMAT='DATEPUB' |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
--echo # |
|||
--echo # Testing expanding authors |
|||
--echo # |
|||
CREATE TABLE t1 |
|||
( |
|||
ISBN CHAR(15), |
|||
Language CHAR(2) FIELD_FORMAT='LANG', |
|||
Subject CHAR(32) FIELD_FORMAT='SUBJECT', |
|||
AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', |
|||
AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', |
|||
Title CHAR(32) FIELD_FORMAT='TITLE', |
|||
Translation CHAR(32) FIELD_FORMAT='TRANSLATION', |
|||
Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', |
|||
Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', |
|||
Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', |
|||
Year int(4) FIELD_FORMAT='DATEPUB' |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; |
|||
SELECT * FROM t1 WHERE ISBN = '9782212090819'; |
|||
|
|||
--echo # |
|||
--echo # To add an author a new table must be created |
|||
--echo # |
|||
CREATE TABLE t2 ( |
|||
FIRSTNAME CHAR(32), |
|||
LASTNAME CHAR(32)) |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn' OPTION_LIST='Object=[2]:AUTHOR'; |
|||
SELECT * FROM t2; |
|||
INSERT INTO t2 VALUES('Charles','Dickens'); |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
DROP TABLE t2; |
|||
|
|||
--echo # |
|||
--echo # Check the biblio file has the good format |
|||
--echo # |
|||
CREATE TABLE t1 |
|||
( |
|||
line char(255) |
|||
) |
|||
ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.jsn'; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
--echo # |
|||
--echo # A file with 2 arrays |
|||
--echo # |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
--echo # |
|||
--echo # Cannot be fully expanded |
|||
--echo # |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
--error ER_GET_ERRMSG |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
--echo # |
|||
--echo # Expand expense in 3 one week tables |
|||
--echo # |
|||
CREATE TABLE t2 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t2; |
|||
|
|||
CREATE TABLE t3 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t3; |
|||
|
|||
CREATE TABLE t4 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', |
|||
WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; |
|||
SELECT * FROM t4; |
|||
|
|||
--echo # |
|||
--echo # The expanded table is made as a TBL table |
|||
--echo # |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32), |
|||
AMOUNT DOUBLE(8,2)) |
|||
ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t2,t3,t4'; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1, t2, t3, t4; |
|||
|
|||
--echo # |
|||
--echo # Three partial JSON tables |
|||
--echo # |
|||
CREATE TABLE t2 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.jsn'; |
|||
SELECT * FROM t2; |
|||
|
|||
CREATE TABLE t3 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.jsn'; |
|||
SELECT * FROM t3; |
|||
|
|||
CREATE TABLE t4 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.jsn'; |
|||
SELECT * FROM t4; |
|||
|
|||
--echo # |
|||
--echo # The complete table can be a multiple JSON table |
|||
--echo # |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.jsn' MULTIPLE=1; |
|||
SELECT * FROM t1; |
|||
DROP TABLE t1; |
|||
|
|||
--echo # |
|||
--echo # Or also a partition JSON table |
|||
--echo # |
|||
CREATE TABLE t1 ( |
|||
WHO CHAR(12), |
|||
WEEK INT(2), |
|||
WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', |
|||
AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') |
|||
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.jsn'; |
|||
ALTER TABLE t1 |
|||
PARTITION BY LIST COLUMNS(WEEK) ( |
|||
PARTITION `3` VALUES IN(3), |
|||
PARTITION `4` VALUES IN(4), |
|||
PARTITION `5` VALUES IN(5)); |
|||
SHOW WARNINGS; |
|||
SELECT * FROM t1; |
|||
SELECT * FROM t1 WHERE WEEK = 4; |
|||
DROP TABLE t1, t2, t3, t4; |
|||
|
|||
# |
|||
# Clean up |
|||
# |
|||
--remove_file $MYSQLD_DATADIR/test/biblio.jsn |
|||
--remove_file $MYSQLD_DATADIR/test/expense.jsn |
|||
--remove_file $MYSQLD_DATADIR/test/mulexp3.jsn |
|||
--remove_file $MYSQLD_DATADIR/test/mulexp4.jsn |
|||
--remove_file $MYSQLD_DATADIR/test/mulexp5.jsn |
|||
1327
storage/connect/tabjson.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,197 @@ |
|||
/*************** tabjson H Declares Source Code File (.H) **************/ |
|||
/* Name: tabjson.h Version 1.0 */ |
|||
/* */ |
|||
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ |
|||
/* */ |
|||
/* This file contains the JSON classes declares. */ |
|||
/***********************************************************************/ |
|||
#include "osutil.h" |
|||
#include "block.h" |
|||
#include "colblk.h" |
|||
#include "json.h" |
|||
|
|||
enum JMODE {MODE_OBJECT, MODE_ARRAY, MODE_VALUE}; |
|||
|
|||
typedef class JSONDEF *PJDEF; |
|||
typedef class TDBJSON *PJTDB; |
|||
typedef class JSONCOL *PJCOL; |
|||
|
|||
class TDBJSN; |
|||
|
|||
/***********************************************************************/ |
|||
/* The JSON tree node. Can be an Object or an Array. */ |
|||
/***********************************************************************/ |
|||
typedef struct _jnode { |
|||
PSZ Key; // The key used for object |
|||
OPVAL Op; // Operator used for this node |
|||
PVAL CncVal; // To cont value used for OP_CNC |
|||
int Rank; // The rank in array |
|||
} JNODE, *PJNODE; |
|||
|
|||
/***********************************************************************/ |
|||
/* JSON table. */ |
|||
/***********************************************************************/ |
|||
class JSONDEF : public DOSDEF { /* Table description */ |
|||
friend class TDBJSON; |
|||
friend class TDBJSN; |
|||
public: |
|||
// Constructor |
|||
JSONDEF(void); |
|||
|
|||
// Implementation |
|||
virtual const char *GetType(void) {return "JSON";} |
|||
|
|||
// Methods |
|||
virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); |
|||
virtual PTDB GetTable(PGLOBAL g, MODE m); |
|||
|
|||
protected: |
|||
// Members |
|||
JMODE Jmode; /* MODE_OBJECT by default */ |
|||
char *Objname; /* Name of first level object */ |
|||
char *Xcol; /* Name of expandable column */ |
|||
int Limit; /* Limit of multiple values */ |
|||
int Pretty; /* Depends on file structure */ |
|||
bool Strict; /* Strict syntax checking */ |
|||
}; // end of JSONDEF |
|||
|
|||
/* -------------------------- TDBJSN class --------------------------- */ |
|||
|
|||
/***********************************************************************/ |
|||
/* This is the JSN Access Method class declaration. */ |
|||
/* The table is a DOS file, each record being a JSON object. */ |
|||
/***********************************************************************/ |
|||
class TDBJSN : public TDBDOS { |
|||
friend class JSONCOL; |
|||
public: |
|||
// Constructor |
|||
TDBJSN(PJDEF tdp, PTXF txfp); |
|||
TDBJSN(TDBJSN *tdbp); |
|||
|
|||
// Implementation |
|||
virtual AMT GetAmType(void) {return TYPE_AM_JSN;} |
|||
virtual bool SkipHeader(PGLOBAL g); |
|||
virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);} |
|||
|
|||
// Methods |
|||
virtual PTDB CopyOne(PTABS t); |
|||
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); |
|||
virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); |
|||
virtual int RowNumber(PGLOBAL g, BOOL b = FALSE) |
|||
{return (b) ? N : Fpos + 1;} |
|||
|
|||
// Database routines |
|||
virtual int Cardinality(PGLOBAL g); |
|||
virtual int GetMaxSize(PGLOBAL g); |
|||
virtual bool OpenDB(PGLOBAL g); |
|||
virtual bool PrepareWriting(PGLOBAL g); |
|||
virtual int ReadDB(PGLOBAL g); |
|||
|
|||
protected: |
|||
// Members |
|||
PJSON Row; // The current row |
|||
PJCOL Colp; // The multiple column |
|||
JMODE Jmode; // MODE_OBJECT by default |
|||
char *Xcol; // Name of expandable column |
|||
int Fpos; // The current row index |
|||
int Spos; // DELETE start index |
|||
int N; // The current Rownum |
|||
int Limit; // Limit of multiple values |
|||
int Pretty; // Depends on file structure |
|||
bool Strict; // Strict syntax checking |
|||
bool NextSame; // Same next row |
|||
bool Comma; // Row has final comma |
|||
int SameRow; // Same row nb |
|||
int Xval; // Index of expandable array |
|||
}; // end of class TDBJSN |
|||
|
|||
/* -------------------------- JSONCOL class -------------------------- */ |
|||
|
|||
/***********************************************************************/ |
|||
/* Class JSONCOL: JSON access method column descriptor. */ |
|||
/***********************************************************************/ |
|||
class JSONCOL : public DOSCOL { |
|||
friend class TDBJSN; |
|||
friend class TDBJSON; |
|||
public: |
|||
// Constructors |
|||
JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); |
|||
JSONCOL(JSONCOL *colp, PTDB tdbp); // Constructor used in copy process |
|||
|
|||
// Implementation |
|||
virtual int GetAmType(void) {return Tjp->GetAmType();} |
|||
|
|||
// Methods |
|||
virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); |
|||
bool ParseJpath(PGLOBAL g); |
|||
virtual void ReadColumn(PGLOBAL g); |
|||
virtual void WriteColumn(PGLOBAL g); |
|||
|
|||
protected: |
|||
bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); |
|||
bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); |
|||
PJSON GetRow(PGLOBAL g, int mode); |
|||
void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); |
|||
|
|||
// Default constructor not to be used |
|||
JSONCOL(void) {} |
|||
|
|||
// Members |
|||
TDBJSN *Tjp; // To the JSN table block |
|||
PVAL MulVal; // To value used by multiple column |
|||
PJAR Arp; // The intermediate array |
|||
char *Jpath; // The json path |
|||
JNODE *Nodes ; // The intermediate objects |
|||
int Nod; // The number of intermediate objects |
|||
int Ival; // Index of multiple values |
|||
int Nx; // The last read sub-row |
|||
bool Xpd; // True for expandable column |
|||
bool Parsed; // True when parsed |
|||
}; // end of class JSONCOL |
|||
|
|||
/* -------------------------- TDBJSON class -------------------------- */ |
|||
|
|||
/***********************************************************************/ |
|||
/* This is the JSON Access Method class declaration. */ |
|||
/***********************************************************************/ |
|||
class TDBJSON : public TDBJSN { |
|||
friend class JSONCOL; |
|||
public: |
|||
// Constructor |
|||
TDBJSON(PJDEF tdp, PTXF txfp); |
|||
TDBJSON(PJTDB tdbp); |
|||
|
|||
// Implementation |
|||
virtual AMT GetAmType(void) {return TYPE_AM_JSON;} |
|||
virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSON(this);} |
|||
|
|||
// Methods |
|||
virtual PTDB CopyOne(PTABS t); |
|||
|
|||
// Database routines |
|||
virtual int Cardinality(PGLOBAL g); |
|||
virtual int GetMaxSize(PGLOBAL g); |
|||
virtual void ResetSize(void); |
|||
virtual int GetRecpos(void) {return Fpos;} |
|||
virtual bool OpenDB(PGLOBAL g); |
|||
virtual int ReadDB(PGLOBAL g); |
|||
virtual bool PrepareWriting(PGLOBAL g) {return false;} |
|||
virtual int WriteDB(PGLOBAL g); |
|||
virtual int DeleteDB(PGLOBAL g, int irc); |
|||
virtual void CloseDB(PGLOBAL g); |
|||
|
|||
// Optimization routines |
|||
virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); |
|||
|
|||
protected: |
|||
int MakeNewDoc(PGLOBAL g); |
|||
int MakeDocument(PGLOBAL g); |
|||
|
|||
// Members |
|||
PJSON Top; // The file JSON tree |
|||
PJAR Doc; // The document array |
|||
char *Objname; // The table object name |
|||
int Multiple; // 0: No 1: DIR 2: Section 3: filelist |
|||
bool Done; // True when document parsing is done |
|||
bool Changed; // After Update, Insert or Delete |
|||
}; // end of class TDBJSON |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue