You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
7.7 KiB
301 lines
7.7 KiB
// CodeMirror, copyright (c) by Marijn Haverbeke and others |
|
// Distributed under an MIT license: https://codemirror.net/LICENSE |
|
|
|
(function() { |
|
var Pos = CodeMirror.Pos; |
|
|
|
var simpleTables = { |
|
"users": ["name", "score", "birthDate"], |
|
"xcountries": ["name", "population", "size"] |
|
}; |
|
|
|
var schemaTables = { |
|
"schema.users": ["name", "score", "birthDate"], |
|
"schema.countries": ["name", "population", "size"] |
|
}; |
|
|
|
var displayTextTables = [{ |
|
text: "mytable", |
|
displayText: "mytable | The main table", |
|
columns: [{text: "id", displayText: "id | Unique ID"}, |
|
{text: "name", displayText: "name | The name"}] |
|
}]; |
|
|
|
var displayTextTablesWithDefault = [ |
|
{ |
|
text: "Api__TokenAliases", |
|
columns: [ |
|
{ |
|
text: "token", |
|
displayText: "token | varchar(255) | Primary", |
|
columnName: "token", |
|
columnHint: "varchar(255) | Primary" |
|
}, |
|
{ |
|
text: "alias", |
|
displayText: "alias | varchar(255) | Primary", |
|
columnName: "alias", |
|
columnHint: "varchar(255) | Primary" |
|
} |
|
] |
|
}, |
|
{ |
|
text: "mytable", |
|
columns: [ |
|
{ text: "id", displayText: "id | Unique ID" }, |
|
{ text: "name", displayText: "name | The name" } |
|
] |
|
} |
|
]; |
|
|
|
namespace = "sql-hint_"; |
|
|
|
function test(name, spec) { |
|
testCM(name, function(cm) { |
|
cm.setValue(spec.value); |
|
cm.setCursor(spec.cursor); |
|
var completion = CodeMirror.hint.sql(cm, { |
|
tables: spec.tables, |
|
defaultTable: spec.defaultTable, |
|
disableKeywords: spec.disableKeywords |
|
}); |
|
if (!deepCompare(completion.list, spec.list)) |
|
throw new Failure("Wrong completion results " + JSON.stringify(completion.list) + " vs " + JSON.stringify(spec.list)); |
|
eqCharPos(completion.from, spec.from); |
|
eqCharPos(completion.to, spec.to); |
|
}, { |
|
value: spec.value, |
|
mode: spec.mode || "text/x-mysql" |
|
}); |
|
} |
|
|
|
test("keywords", { |
|
value: "SEL", |
|
cursor: Pos(0, 3), |
|
list: [{"text":"SELECT","className":"CodeMirror-hint-keyword"}], |
|
from: Pos(0, 0), |
|
to: Pos(0, 3) |
|
}); |
|
|
|
test("keywords_disabled", { |
|
value: "SEL", |
|
cursor: Pos(0, 3), |
|
disableKeywords: true, |
|
list: [], |
|
from: Pos(0, 0), |
|
to: Pos(0, 3) |
|
}); |
|
|
|
test("from", { |
|
value: "SELECT * fr", |
|
cursor: Pos(0, 11), |
|
list: [{"text":"FROM","className":"CodeMirror-hint-keyword"}], |
|
from: Pos(0, 9), |
|
to: Pos(0, 11) |
|
}); |
|
|
|
test("table", { |
|
value: "SELECT xc", |
|
cursor: Pos(0, 9), |
|
tables: simpleTables, |
|
list: [{"text":"xcountries","className":"CodeMirror-hint-table"}], |
|
from: Pos(0, 7), |
|
to: Pos(0, 9) |
|
}); |
|
|
|
test("columns", { |
|
value: "SELECT users.", |
|
cursor: Pos(0, 13), |
|
tables: simpleTables, |
|
list: ["users.name", "users.score", "users.birthDate"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 13) |
|
}); |
|
|
|
test("singlecolumn", { |
|
value: "SELECT users.na", |
|
cursor: Pos(0, 15), |
|
tables: simpleTables, |
|
list: ["users.name"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 15) |
|
}); |
|
|
|
test("quoted", { |
|
value: "SELECT `users`.`na", |
|
cursor: Pos(0, 18), |
|
tables: simpleTables, |
|
list: ["`users`.`name`"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 18) |
|
}); |
|
|
|
test("doublequoted", { |
|
value: "SELECT \"users\".\"na", |
|
cursor: Pos(0, 18), |
|
tables: simpleTables, |
|
list: ["\"users\".\"name\""], |
|
from: Pos(0, 7), |
|
to: Pos(0, 18), |
|
mode: "text/x-sqlite" |
|
}); |
|
|
|
test("quotedcolumn", { |
|
value: "SELECT users.`na", |
|
cursor: Pos(0, 16), |
|
tables: simpleTables, |
|
list: ["`users`.`name`"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 16) |
|
}); |
|
|
|
test("doublequotedcolumn", { |
|
value: "SELECT users.\"na", |
|
cursor: Pos(0, 16), |
|
tables: simpleTables, |
|
list: ["\"users\".\"name\""], |
|
from: Pos(0, 7), |
|
to: Pos(0, 16), |
|
mode: "text/x-sqlite" |
|
}); |
|
|
|
test("schema", { |
|
value: "SELECT schem", |
|
cursor: Pos(0, 12), |
|
tables: schemaTables, |
|
list: [{"text":"schema.users","className":"CodeMirror-hint-table"}, |
|
{"text":"schema.countries","className":"CodeMirror-hint-table"}, |
|
{"text":"SCHEMA","className":"CodeMirror-hint-keyword"}, |
|
{"text":"SCHEMA_NAME","className":"CodeMirror-hint-keyword"}, |
|
{"text":"SCHEMAS","className":"CodeMirror-hint-keyword"}], |
|
from: Pos(0, 7), |
|
to: Pos(0, 12) |
|
}); |
|
|
|
test("schemaquoted", { |
|
value: "SELECT `sch", |
|
cursor: Pos(0, 11), |
|
tables: schemaTables, |
|
list: ["`schema`.`users`", "`schema`.`countries`"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 11) |
|
}); |
|
|
|
test("schemadoublequoted", { |
|
value: "SELECT \"sch", |
|
cursor: Pos(0, 11), |
|
tables: schemaTables, |
|
list: ["\"schema\".\"users\"", "\"schema\".\"countries\""], |
|
from: Pos(0, 7), |
|
to: Pos(0, 11), |
|
mode: "text/x-sqlite" |
|
}); |
|
|
|
test("schemacolumn", { |
|
value: "SELECT schema.users.", |
|
cursor: Pos(0, 20), |
|
tables: schemaTables, |
|
list: ["schema.users.name", |
|
"schema.users.score", |
|
"schema.users.birthDate"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 20) |
|
}); |
|
|
|
test("schemacolumnquoted", { |
|
value: "SELECT `schema`.`users`.", |
|
cursor: Pos(0, 24), |
|
tables: schemaTables, |
|
list: ["`schema`.`users`.`name`", |
|
"`schema`.`users`.`score`", |
|
"`schema`.`users`.`birthDate`"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 24) |
|
}); |
|
|
|
test("schemacolumndoublequoted", { |
|
value: "SELECT \"schema\".\"users\".", |
|
cursor: Pos(0, 24), |
|
tables: schemaTables, |
|
list: ["\"schema\".\"users\".\"name\"", |
|
"\"schema\".\"users\".\"score\"", |
|
"\"schema\".\"users\".\"birthDate\""], |
|
from: Pos(0, 7), |
|
to: Pos(0, 24), |
|
mode: "text/x-sqlite" |
|
}); |
|
|
|
test("displayText_default_table", { |
|
value: "SELECT a", |
|
cursor: Pos(0, 8), |
|
disableKeywords: true, |
|
defaultTable: "Api__TokenAliases", |
|
tables: displayTextTablesWithDefault, |
|
list: [ |
|
{ |
|
text: "alias", |
|
displayText: "alias | varchar(255) | Primary", |
|
columnName: "alias", |
|
columnHint: "varchar(255) | Primary", |
|
className: "CodeMirror-hint-table CodeMirror-hint-default-table" |
|
}, |
|
{ text: "Api__TokenAliases", className: "CodeMirror-hint-table" } |
|
], |
|
from: Pos(0, 7), |
|
to: Pos(0, 8) |
|
}); |
|
|
|
test("displayText_table", { |
|
value: "SELECT myt", |
|
cursor: Pos(0, 10), |
|
tables: displayTextTables, |
|
list: [{text: "mytable", displayText: "mytable | The main table", "className":"CodeMirror-hint-table"}], |
|
from: Pos(0, 7), |
|
to: Pos(0, 10) |
|
}); |
|
|
|
test("displayText_column", { |
|
value: "SELECT mytable.", |
|
cursor: Pos(0, 15), |
|
tables: displayTextTables, |
|
list: [{text: "mytable.id", displayText: "id | Unique ID"}, |
|
{text: "mytable.name", displayText: "name | The name"}], |
|
from: Pos(0, 7), |
|
to: Pos(0, 15) |
|
}); |
|
|
|
test("alias_complete", { |
|
value: "SELECT t. FROM users t", |
|
cursor: Pos(0, 9), |
|
tables: simpleTables, |
|
list: ["t.name", "t.score", "t.birthDate"], |
|
from: Pos(0, 7), |
|
to: Pos(0, 9) |
|
}); |
|
|
|
test("alias_complete_with_displayText", { |
|
value: "SELECT t. FROM mytable t", |
|
cursor: Pos(0, 9), |
|
tables: displayTextTables, |
|
list: [{text: "t.id", displayText: "id | Unique ID"}, |
|
{text: "t.name", displayText: "name | The name"}], |
|
from: Pos(0, 7), |
|
to: Pos(0, 9) |
|
}) |
|
|
|
function deepCompare(a, b) { |
|
if (a === b) return true |
|
if (!(a && typeof a == "object") || |
|
!(b && typeof b == "object")) return false |
|
var array = Array.isArray(a) |
|
if (Array.isArray(b) != array) return false |
|
if (array) { |
|
if (a.length != b.length) return false |
|
for (var i = 0; i < a.length; i++) if (!deepCompare(a[i], b[i])) return false |
|
} else { |
|
for (var p in a) if (!(p in b) || !deepCompare(a[p], b[p])) return false |
|
for (var p in b) if (!(p in a)) return false |
|
} |
|
return true |
|
} |
|
})();
|
|
|