diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8642bc3d5..e3b4b896a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,18 @@
##2.1.6
+* Added tests for inserting via fdw on postgres for user identified elements
+* Added validation for inserting data via fdw on postgres.
+* Fixed [#451](https://github.com/pietermartin/sqlg/issues/451). Postgresql copy command did not take special characters into account.
+* Fixed [#450](https://github.com/pietermartin/sqlg/issues/450). Fixed a bunch of copy past errors in Sqlg's ddl statements.
+* Fixed [#446](https://github.com/pietermartin/sqlg/issues/446). Upgraded H2 to 2.1.210
+* Implemented [#334](https://github.com/pietermartin/sqlg/issues/332). Added `Topology.lock` and `Topology.unlock`.
+* Upgrade postgresql jdbc driver to 42.3.1
+* Implemented [#361](https://github.com/pietermartin/sqlg/issues/361). Implements UUID support on postgresql, hsqldb and h2.
+* Implemented [#431](https://github.com/pietermartin/sqlg/issues/431). Optimizes `id()`.
+* Implemented [#139](https://github.com/pietermartin/sqlg/issues/139).
+Added `rename` to `VertexLabel`, `EdgeLabel` and `PropertyColumn`
* BREAKING CHANGE: Changed `TopologyListener`'s interface, `oldValue` is now a `TopologyInf`
-*Implemented [#428](https://github.com/pietermartin/sqlg/issues/428).
+* Implemented [#428](https://github.com/pietermartin/sqlg/issues/428).
Added ability to import foreign schemas and to import tables into an existing schema.
Both import must be consistent, i.e. can not reference elements that are not being imported.
diff --git a/README.md b/README.md
index 8f02faffd..2e651c319 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,8 @@ Sqlg
Currently [H2](http://h2database.com/), [HSQLDB](http://hsqldb.org/), [Postgresql](http://www.postgresql.org/),
[MariaDB](https://mariadb.org/), [MySql](https://www.mysql.com/) and [MSSqlServer](https://www.microsoft.com/en-us/sql-server/sql-server-2017) are supported.
+2.1.6 [Documentation](http://sqlg.org/docs/2.1.6)
+
2.1.5 [Documentation](http://sqlg.org/docs/2.1.5)
2.1.4 [Documentation](http://sqlg.org/docs/2.1.4)
diff --git a/pom.xml b/pom.xml
index 12f3cd895..f364a2645 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
org.umlg
sqlg
pom
- 2.1.6-SNAPSHOT
+ 2.1.7-SNAPSHOT
sqlg
Sqlg is a tinkerpop 3 implementation on top of a rdbms.
@@ -31,10 +31,10 @@
git@github.com:pietermartin/sqlg.git
- 2.1.6-SNAPSHOT
+ 2.1.7-SNAPSHOT
3.5.1
- 1.7.25
- 4.13.1
+ 2.17.0
+ 4.13.2
@@ -101,23 +101,24 @@
-Dbuild.dir=${project.build.directory}
**/H2AllTest.java
-
-
+ **/SqlgH2StructureStandardTest.java
+ **/SqlgH2ProcessStandardTest.java
+
+ **/SqlgHsqldbStructureStandardTest.java
+ **/SqlgHsqldbProcessStandardTest.java
+ **/HsqldbAllTest.java
**/SqlgPostgresStructureStandardTest.java
**/SqlgPostgresProcessStandardTest.java
**/PostgresAllTest.java
- **/SqlgHsqldbStructureStandardTest.java
- **/SqlgHsqldbProcessStandardTest.java
- **/HsqldbAllTest.java
+ **/SqlgMariaDBProcessStandardTest.java
+ **/MariadbAllTest.java
-
- **/MariadbAllTest.java
@@ -203,6 +204,7 @@
sqlg-doc
sqlg-ui
sqlg-gremlin-server
+ sqlg-jdbc-pool
@@ -248,6 +250,16 @@
sqlg-core
${sqlg.version}
+
+ org.umlg
+ sqlg-c3p0
+ ${sqlg.version}
+
+
+ org.umlg
+ sqlg-hikari
+ ${sqlg.version}
+
org.umlg
sqlg-postgres
@@ -341,6 +353,11 @@
c3p0
0.9.5.5
+
+ com.zaxxer
+ HikariCP
+ 5.0.0
+
com.google.guava
guava
@@ -349,7 +366,7 @@
com.fasterxml.jackson.core
jackson-databind
- 2.10.0.pr1
+ 2.13.2.1
org.apache.commons
@@ -369,7 +386,7 @@
org.apache.commons
commons-text
- 1.9
+ 1.10.0
io.projectreactor
diff --git a/sqlg-core/pom.xml b/sqlg-core/pom.xml
index 54c96082e..687b481a9 100755
--- a/sqlg-core/pom.xml
+++ b/sqlg-core/pom.xml
@@ -5,7 +5,7 @@
org.umlg
sqlg
- 2.1.6-SNAPSHOT
+ 2.1.7-SNAPSHOT
sqlg-core
sqlg :: core
@@ -29,10 +29,6 @@
-
- com.mchange
- c3p0
-
com.google.guava
guava
diff --git a/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/BaseSqlDialect.java b/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/BaseSqlDialect.java
index 4c9323209..b1b856abc 100644
--- a/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/BaseSqlDialect.java
+++ b/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/BaseSqlDialect.java
@@ -60,7 +60,7 @@ public List getSchemaNames(DatabaseMetaData metaData) {
@Override
public List> getVertexTables(DatabaseMetaData metaData) {
List> vertexTables = new ArrayList<>();
- String[] types = new String[]{"TABLE"};
+ String[] types = new String[]{"TABLE", "PARTITIONED TABLE"};
try {
//load the vertices
try (ResultSet vertexRs = metaData.getTables(null, null, Topology.VERTEX_PREFIX + "%", types)) {
@@ -85,7 +85,7 @@ public List> getVertexTables(DatabaseMetaData met
@Override
public List> getEdgeTables(DatabaseMetaData metaData) {
List> edgeTables = new ArrayList<>();
- String[] types = new String[]{"TABLE"};
+ String[] types = new String[]{"TABLE", "PARTITIONED TABLE"};
try {
//load the edges without their properties
try (ResultSet edgeRs = metaData.getTables(null, null, Topology.EDGE_PREFIX + "%", types)) {
diff --git a/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/SqlDialect.java b/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/SqlDialect.java
index a2c542b92..0d8cfdbed 100644
--- a/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/SqlDialect.java
+++ b/sqlg-core/src/main/java/org/umlg/sqlg/sql/dialect/SqlDialect.java
@@ -157,6 +157,10 @@ default boolean supportsJsonArrayValues() {
return false;
}
+ default boolean supportsUUID() {
+ return true;
+ }
+
default boolean supportsDurationArrayValues() {
return true;
}
@@ -1383,4 +1387,17 @@ default String renameColumn(String schema, String table, String column, String n
}
return sql.toString();
}
+
+ default String renameTable(String schema, String table, String newName) {
+ StringBuilder sql = new StringBuilder("ALTER TABLE ");
+ sql.append(maybeWrapInQoutes(schema));
+ sql.append(".");
+ sql.append(maybeWrapInQoutes(table));
+ sql.append(" RENAME TO ");
+ sql.append(maybeWrapInQoutes(newName));
+ if (needsSemicolon()) {
+ sql.append(";");
+ }
+ return sql.toString();
+ }
}
diff --git a/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/AndOrHasContainer.java b/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/AndOrHasContainer.java
index 24752dff3..171bc0833 100644
--- a/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/AndOrHasContainer.java
+++ b/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/AndOrHasContainer.java
@@ -10,7 +10,6 @@
import org.umlg.sqlg.predicate.Existence;
import org.umlg.sqlg.structure.PropertyType;
import org.umlg.sqlg.structure.SqlgGraph;
-import org.umlg.sqlg.util.SqlgUtil;
import java.util.ArrayList;
import java.util.List;
@@ -95,42 +94,42 @@ private void toSql(SqlgGraph sqlgGraph, SchemaTableTree schemaTableTree, StringB
if (!this.hasContainers.isEmpty()) {
boolean first = true;
for (HasContainer h : this.hasContainers) {
- if (!SqlgUtil.isBulkWithin(sqlgGraph, h)) {
+// if (!SqlgUtil.isBulkWithin(sqlgGraph, h)) {
if (first) {
first = false;
result.append("(");
} else {
- result.append(" AND ");
+ result.append(" AND ");
}
- String k=h.getKey();
+ String k = h.getKey();
WhereClause whereClause = WhereClause.from(h.getPredicate());
-
+
// check if property exists
- String bool=null;
- if (!k.equals(T.id.getAccessor())){
- Map pts=sqlgGraph.getTopology().getTableFor(schemaTableTree.getSchemaTable());
- if (pts!=null && !pts.containsKey(k)){
- // verify if we have a value
- Multimap keyValueMap=LinkedListMultimap.create();
- whereClause.putKeyValueMap(h, keyValueMap, schemaTableTree);
- // we do
- if (keyValueMap.size()>0){
- bool="? is null";
- } else {
- if (Existence.NULL.equals(h.getBiPredicate())) {
- bool="1=1";
- } else {
- bool="1=0";
- }
- }
+ String bool = null;
+ if (!k.equals(T.id.getAccessor())) {
+ Map pts = sqlgGraph.getTopology().getTableFor(schemaTableTree.getSchemaTable());
+ if (pts != null && !pts.containsKey(k)) {
+ // verify if we have a value
+ Multimap keyValueMap = LinkedListMultimap.create();
+ whereClause.putKeyValueMap(h, keyValueMap, schemaTableTree);
+ // we do
+ if (keyValueMap.size() > 0) {
+ bool = "? is null";
+ } else {
+ if (Existence.NULL.equals(h.getBiPredicate())) {
+ bool = "1=1";
+ } else {
+ bool = "1=0";
+ }
+ }
}
}
- if (bool!=null){
- result.append(bool);
+ if (bool != null) {
+ result.append(bool);
} else {
- result.append(whereClause.toSql(sqlgGraph, schemaTableTree, h));
+ result.append(whereClause.toSql(sqlgGraph, schemaTableTree, h, true));
}
- }
+// }
}
if (!first) {
result.append(")");
diff --git a/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/GremlinParser.java b/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/GremlinParser.java
index 82a1244fb..145f643b2 100644
--- a/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/GremlinParser.java
+++ b/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/GremlinParser.java
@@ -19,7 +19,7 @@ public GremlinParser(SqlgGraph sqlgGraph) {
this.sqlgGraph = sqlgGraph;
}
- public Set parse(ReplacedStepTree replacedStepTree) {
+ public Set parse(ReplacedStepTree,?> replacedStepTree) {
ReplacedStep, ?> startReplacedStep = replacedStepTree.root().getReplacedStep();
Preconditions.checkState(startReplacedStep.isGraphStep(), "Step must be a GraphStep");
Set rootSchemaTableTrees = startReplacedStep.getRootSchemaTableTrees(this.sqlgGraph, replacedStepTree.getDepth());
diff --git a/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/ReplacedStep.java b/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/ReplacedStep.java
index da2f41961..73f595bf7 100644
--- a/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/ReplacedStep.java
+++ b/sqlg-core/src/main/java/org/umlg/sqlg/sql/parse/ReplacedStep.java
@@ -79,6 +79,9 @@ public class ReplacedStep {
*/
private boolean isForSqlgSchema;
+ //IDStep, i.e. only return the element's id.
+ private boolean idOnly = false;
+
private ReplacedStep() {
}
@@ -195,7 +198,7 @@ private Set appendPathForVertexStep(SchemaTableTree schemaTable
throw new IllegalStateException("Unknown direction " + direction.name());
}
- Map>> groupedIds = groupIdsBySchemaTable();
+ Map, RecordId>>> groupedIds = groupIdsBySchemaTable();
//Each labelToTravers more than the first one forms a new distinct path
for (SchemaTable inEdgeLabelToTravers : inEdgeLabelsToTraversers) {
@@ -211,7 +214,7 @@ private Set appendPathForVertexStep(SchemaTableTree schemaTable
this.labels);
SchemaTable schemaTable = SchemaTable.from(this.topology.getSqlgGraph(), inEdgeLabelToTravers.toString());
- List> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
+ List, RecordId>> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
addIdHasContainers(schemaTableTreeChild, biPredicateRecordIs);
result.add(schemaTableTreeChild);
@@ -265,7 +268,7 @@ private Set appendPathForVertexStep(SchemaTableTree schemaTable
this.labels);
SchemaTable schemaTable = SchemaTable.from(this.topology.getSqlgGraph(), outEdgeLabelToTravers.toString());
- List> biPredicateRecordIds = groupedIds.get(schemaTable.withOutPrefix());
+ List, RecordId>> biPredicateRecordIds = groupedIds.get(schemaTable.withOutPrefix());
addIdHasContainers(schemaTableTreeChild, biPredicateRecordIds);
result.add(schemaTableTreeChild);
@@ -286,7 +289,7 @@ private Set appendPathForVertexStep(SchemaTableTree schemaTable
SchemaTable schemaTableTo = SchemaTable.of(foreignKeySchema, VERTEX_PREFIX + SqlgUtil.removeTrailingInId(foreignKeyTable));
if (passesLabelHasContainers(this.topology.getSqlgGraph(), true, schemaTableTo.toString()) &&
passesRestrictedProperties(filteredAllTables.get(schemaTableTo.toString()))) {
-
+
if (first) {
first = false;
schemaTableTreeChild = schemaTableTree.addChild(
@@ -308,7 +311,7 @@ private Set appendPathForVertexStep(SchemaTableTree schemaTable
private Set calculatePathFromEdgeToVertex(SchemaTableTree schemaTableTree, SchemaTable labelToTravers, Direction direction) {
Preconditions.checkArgument(labelToTravers.isEdgeTable());
- Map>> groupedIds = groupIdsBySchemaTable();
+ Map, RecordId>>> groupedIds = groupIdsBySchemaTable();
Set result = new HashSet<>();
Map> edgeForeignKeys = this.topology.getEdgeForeignKeys();
@@ -334,7 +337,7 @@ private Set calculatePathFromEdgeToVertex(SchemaTableTree schem
this,
this.labels
);
- List> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
+ List, RecordId>> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
addIdHasContainers(schemaTableTreeChild, biPredicateRecordIs);
result.add(schemaTableTreeChild);
}
@@ -348,7 +351,7 @@ private Set calculatePathFromEdgeToVertex(SchemaTableTree schem
this,
this.labels
);
- List> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
+ List, RecordId>> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
addIdHasContainers(schemaTableTreeChild, biPredicateRecordIs);
result.add(schemaTableTreeChild);
}
@@ -357,7 +360,12 @@ private Set calculatePathFromEdgeToVertex(SchemaTableTree schem
return result;
}
- private Set calculatePathFromVertexToEdge(SchemaTableTree schemaTableTree, SchemaTable schemaTableTo, Direction direction, Map>> groupedIds) {
+ private Set calculatePathFromVertexToEdge(
+ SchemaTableTree schemaTableTree,
+ SchemaTable schemaTableTo,
+ Direction direction,
+ Map, RecordId>>> groupedIds) {
+
Set result = new HashSet<>();
//add the child for schemaTableTo to the tree
SchemaTableTree schemaTableTree1 = schemaTableTree.addChild(
@@ -368,16 +376,16 @@ private Set calculatePathFromVertexToEdge(SchemaTableTree schem
this.labels
);
SchemaTable schemaTable = SchemaTable.from(this.topology.getSqlgGraph(), schemaTableTo.toString());
- List> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
+ List, RecordId>> biPredicateRecordIs = groupedIds.get(schemaTable.withOutPrefix());
addIdHasContainers(schemaTableTree1, biPredicateRecordIs);
result.add(schemaTableTree1);
return result;
}
- private void addIdHasContainers(SchemaTableTree schemaTableTree1, List> biPredicateRecordIds) {
+ private void addIdHasContainers(SchemaTableTree schemaTableTree1, List, RecordId>> biPredicateRecordIds) {
if (biPredicateRecordIds != null) {
- for (Multimap biPredicateRecordId : biPredicateRecordIds) {
- for (BiPredicate biPredicate : biPredicateRecordId.keySet()) {
+ for (Multimap, RecordId> biPredicateRecordId : biPredicateRecordIds) {
+ for (BiPredicate, ?> biPredicate : biPredicateRecordId.keySet()) {
Collection recordIds = biPredicateRecordId.get(biPredicate);
HasContainer idHasContainer;
//id hasContainers are only optimized for BaseStrategy.SUPPORTED_ID_BI_PREDICATE within, without, eq, neq
@@ -431,9 +439,9 @@ private Set filterVertexStepOnEdgeLabels(Set labels, S
@Override
public String toString() {
if (this.step != null) {
- return this.step.toString() + " :: " + this.hasContainers.toString() + " :: leftJoin = " + this.leftJoin + " :: joinToLeftJoin = " + this.joinToLeftJoin;
+ return this.step + " :: " + this.hasContainers + " :: leftJoin = " + this.leftJoin + " :: joinToLeftJoin = " + this.joinToLeftJoin;
} else {
- return "fakeStep :: " + this.hasContainers.toString() + " :: leftJoin = " + this.leftJoin + " :: joinToLeftJoin = " + this.joinToLeftJoin;
+ return "fakeStep :: " + this.hasContainers + " :: leftJoin = " + this.leftJoin + " :: joinToLeftJoin = " + this.joinToLeftJoin;
}
}
@@ -469,7 +477,7 @@ Set getRootSchemaTableTrees(SqlgGraph sqlgGraph, int replacedSt
final boolean isEdge = !isVertex;
//RecordIds grouped by SchemaTable
- Map>> groupedIds = null;
+ Map, RecordId>>> groupedIds = null;
if (!this.idHasContainers.isEmpty()) {
groupedIds = groupIdsBySchemaTable();
}
@@ -504,7 +512,7 @@ private void collectSchemaTableTrees(
SqlgGraph sqlgGraph,
int replacedStepDepth,
Set result,
- Map>> groupedIds,
+ Map, RecordId>>> groupedIds,
String table) {
SchemaTable schemaTable = SchemaTable.from(sqlgGraph, table);
@@ -512,10 +520,10 @@ private void collectSchemaTableTrees(
List schemaTableTreeHasContainers = new ArrayList<>(this.hasContainers);
if (groupedIds != null) {
- List> biPredicateRecordIds = groupedIds.get(schemaTable.withOutPrefix());
+ List, RecordId>> biPredicateRecordIds = groupedIds.get(schemaTable.withOutPrefix());
if (biPredicateRecordIds != null) {
- for (Multimap biPredicateRecordId : biPredicateRecordIds) {
- for (BiPredicate biPredicate : biPredicateRecordId.keySet()) {
+ for (Multimap, RecordId> biPredicateRecordId : biPredicateRecordIds) {
+ for (BiPredicate, ?> biPredicate : biPredicateRecordId.keySet()) {
Collection recordIds = biPredicateRecordId.get(biPredicate);
HasContainer idHasContainer;
//id hasContainers are only optimized for BaseStrategy.SUPPORTED_ID_BI_PREDICATE within, without, eq, neq
@@ -550,7 +558,8 @@ private void collectSchemaTableTrees(
replacedStepDepth,
this.labels,
aggregateFunction,
- groupBy
+ groupBy,
+ idOnly
);
schemaTableTree.setRestrictedProperties(getRestrictedProperties());
result.add(schemaTableTree);
@@ -598,7 +607,7 @@ private boolean passesLabelHasContainers(SqlgGraph sqlgGraph, boolean isVertex,
}
private boolean passesRestrictedProperties(Map propertyTypeMap) {
- if (this.restrictedProperties == null) {
+ if (this.isIdOnly() || this.restrictedProperties == null) {
return true;
}
for (String restrictedProperty : this.restrictedProperties) {
@@ -616,26 +625,26 @@ private boolean passesRestrictedProperties(Map propertyTyp
*
* @return
*/
- private Map>> groupIdsBySchemaTable() {
- Map>> result = new HashMap<>();
+ private Map, RecordId>>> groupIdsBySchemaTable() {
+ Map, RecordId>>> result = new HashMap<>();
for (HasContainer idHasContainer : this.idHasContainers) {
Map newHasContainerMap = new HashMap<>();
@SuppressWarnings("unchecked")
P