Skip to content
Snippets Groups Projects
Commit a895cdff authored by Henrik tom Wörden's avatar Henrik tom Wörden
Browse files

Merge branch 'f-name-query' into 'dev'

f-name-query -> dev

# Summary

Fix for #51

See  caosdb-mysqlbackend!13  for more information.

# Focus

The backend-api has changed and most of the changes just replace any usage of the obsolete `entities.name` column be an equivalent SQL using the `name_data` table.

The statements are independent of each other and can be reviewed piece by piece. I added a docstring for all sql statements in question.

Luckily, most of the server's interactions with the backend stays untouched, because the server uses higher level procedures for most things, which are changed in caosdb-mysqlbackend!13 
 
parents 44e4e74e 3a0c2593
No related branches found
No related tags found
No related merge requests found
......@@ -23,6 +23,7 @@
#
variables:
DEPLOY_REF: dev
CI_REGISTRY_IMAGE: $CI_REGISTRY/caosdb/caosdb-server/caosdb-server-testenv:latest
image: $CI_REGISTRY_IMAGE
......@@ -69,7 +70,8 @@ trigger_build:
script:
- /usr/bin/curl -X POST
-F token=$DEPLOY_TRIGGER_TOKEN
-F "variables[F_BRANCH]=$CI_COMMIT_REF_NAME"
-F "variables[SERVER]=$CI_COMMIT_REF_NAME"
-F "variables[TriggerdBy]=SERVER"
-F "variables[TriggerdByHash]=$CI_COMMIT_SHORT_SHA"
-F ref=dev https://gitlab.indiscale.com/api/v4/projects/14/trigger/pipeline
-F ref=$DEPLOY_REF https://gitlab.indiscale.com/api/v4/projects/14/trigger/pipeline
......@@ -36,6 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
* #51 - name queries (e.g. `FIND ENTITY WITH name = ...`)
- #27 - star matches slashes (e.g. for `FIND ... STORED AT /*.dat`).
- #30 - file path cannot be in quotes
- #46 - Server-side scripting failed as an unprivileged user because there was
......
......@@ -67,7 +67,7 @@ MYSQL_USER_NAME=caosdb
# Password for the user
MYSQL_USER_PASSWORD=caosdb
# Schema of mysql procedures and tables which is required by this CaosDB instance
MYSQL_SCHEMA_VERSION=v2.1.2
MYSQL_SCHEMA_VERSION=v3.0.0-rc1
# --------------------------------------------------
......
......@@ -115,7 +115,7 @@
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4</artifactId>
<version>4.7.2</version>
<version>4.8-1</version>
</dependency>
<dependency>
<groupId>org.restlet.jse</groupId>
......@@ -212,7 +212,7 @@
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>4.7.2</version>
<version>4.8-1</version>
<configuration>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
</configuration>
......
......@@ -18,8 +18,12 @@ public class MySQLGetAllNames extends MySQLTransaction implements GetAllNamesImp
super(access);
}
/** Retrieve tuples (EntityName, EntityRole, ACL) for all entities which have a name. */
public static final String STMT_GET_ALL_NAMES =
"Select e.name as EntityName, e.role as EntityRole, a.acl as ACL FROM entities as e JOIN entity_acl as a ON (a.id=e.acl) WHERE e.name IS NOT NULL and e.role!='ROLE'";
"SELECT d.value as EntityName, e.role AS EntityRole, a.acl AS ACL "
+ "FROM name_data AS d JOIN entities AS e JOIN entity_acl AS a "
+ "ON (d.domain_id = 0 AND d.property_id = 20 AND d.entity_id = e.id AND a.id = e.acl) "
+ "WHERE e.role != 'ROLE' AND e.role != 'DATATYPE'";
@Override
public List<SparseEntity> execute() {
......
......@@ -36,9 +36,19 @@ public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImp
super(access);
}
public static final String STMT_GET_ID_BY_NAME = "Select id from entities where name=?";
public static final String STMT_AND_ROLE = " AND role=?";
public static final String STMT_NOT_ROLE = " AND role!='ROLE'";
/**
* Resolves the (primary) name of an entity to an id. This query is not necessarily unique.
* Therefore {@link #STMT_AND_ROLE}, {@link #STMT_NOT_ROLE}, and {@link #STMT_LIMIT} can as
* additional conditions.
*/
public static final String STMT_GET_ID_BY_NAME =
"Select n.entity_id AS id "
+ "FROM name_data AS n JOIN entities AS e "
+ "ON (n.domain_id=0 AND n.property_id=20 AND e.id = n.entity_id)"
+ "WHERE n.value=?";
public static final String STMT_AND_ROLE = " AND e.role=?";
public static final String STMT_NOT_ROLE = " AND e.role!='ROLE'";
public static final String STMT_LIMIT = " LIMIT ";
@Override
......@@ -55,17 +65,13 @@ public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImp
if (role != null) {
stmt.setString(2, role);
}
ResultSet rs = null;
try {
rs = stmt.executeQuery();
try (ResultSet rs = stmt.executeQuery()) {
final ArrayList<Integer> ret = new ArrayList<Integer>();
while (rs.next()) {
ret.add(rs.getInt("id"));
}
return ret;
} finally {
rs.close();
}
} catch (final Exception e) {
throw new TransactionException(e);
......
......@@ -15,10 +15,22 @@ public class MySQLInsertEntityDatatype extends MySQLTransaction
super(access);
}
/**
* Inserts atomic data types of properties into the data_type table. Has two parameters, the
* property_id and the data type name.
*/
public static final String STMT_INSERT_ENTITY_DATATYPE =
"INSERT INTO data_type (domain_id, entity_id, property_id, datatype) SELECT 0, 0, ?, ( SELECT id from entities where name = ? LIMIT 1);";
"INSERT INTO data_type (domain_id, entity_id, property_id, datatype) "
+ "SELECT 0, 0, ?, "
+ "( SELECT entity_id FROM name_data WHERE domain_id = 0 AND property_id = 20 AND value = ? LIMIT 1);";
/**
* Inserts collection data types of properties into the data_type table. Has two parameters, the
* property_id and the type of collection (e.g. 'LIST').
*/
public static final String STMT_INSERT_ENTITY_COLLECTION =
"INSERT INTO collection_type (domain_id, entity_id, property_id, collection) SELECT 0, 0, ?, ?;";
"INSERT INTO collection_type (domain_id, entity_id, property_id, collection) "
+ "SELECT 0, 0, ?, ?;";
@Override
public void execute(final SparseEntity entity) {
......
......@@ -38,17 +38,17 @@ public class MySQLRetrieveAll extends MySQLTransaction implements RetrieveAllImp
super(access);
}
public static final String STMT_GET_ALL_HEAD = "Select id from entities where ";
public static final String STMT_GET_ALL_HEAD = "Select id from entities where id > 99";
public static final String STMT_ENTITY_WHERE_CLAUSE =
" ( role=? OR role='"
" AND ( role=? OR role='"
+ Role.RecordType
+ "' OR role='"
+ Role.Property
+ "' OR role='"
+ Role.File
+ "'"
+ " ) AND ( NOT name=role OR name IS NULL)";
public static final String STMT_OTHER_ROLES = " role=? AND ( NOT name=role OR name IS NULL)";
+ " )";
public static final String STMT_OTHER_ROLES = " AND role=?";
@Override
public List<Integer> execute(final String role) throws TransactionException {
......
......@@ -38,8 +38,19 @@ public class MySQLRetrieveDatatypes extends MySQLTransaction implements Retrieve
super(access);
}
/**
* Retrieve (ParentID, ParentName, ParentDescription, ParentRole, ACL) tuple which actually
* contains the ID, name, description, role and ACL of the datatype. The misleading names should
* be fixed sometimes (TODO) but this also requires to adjust the code below, which uses {@link
* DatabaseUtils#parseParentResultSet(ResultSet)}.
*/
private static final String STMT_GET_DATATYPE =
"select id AS ParentID, name AS ParentName, description as ParentDescription, role as ParentRole, (SELECT acl FROM entity_acl as a WHERE a.id=e.acl) as ACL from entities as e where e.role='DATATYPE'";
"SELECT id AS ParentID, "
+ "(SELECT value FROM name_data WHERE domain_id = 0 AND entity_ID = e.id AND property_id = 20) AS ParentName, "
+ "description AS ParentDescription, "
+ "role AS ParentRole, "
+ "(SELECT acl FROM entity_acl AS a WHERE a.id=e.acl) as ACL "
+ "FROM entities AS e WHERE e.role='DATATYPE'";
@Override
public ArrayList<VerySparseEntity> execute() throws TransactionException {
......
......@@ -51,13 +51,10 @@ public class MySQLRetrieveSparseEntity extends MySQLTransaction
final PreparedStatement preparedStatement = prepareStatement(stmtStr);
preparedStatement.setInt(1, id);
final ResultSet rs = preparedStatement.executeQuery();
try {
try (final ResultSet rs = preparedStatement.executeQuery()) {
if (rs.next()) {
return DatabaseUtils.parseEntityResultSet(rs);
}
} finally {
rs.close();
}
} catch (final SQLException e) {
throw new TransactionException(e);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment