You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@chemistry.apache.org by "Nicolas Brandt (JIRA)" <ji...@apache.org> on 2015/03/04 17:50:04 UTC
[jira] [Created] (CMIS-896) Improve how JSON response of CMIS query
function is built
Nicolas Brandt created CMIS-896:
-----------------------------------
Summary: Improve how JSON response of CMIS query function is built
Key: CMIS-896
URL: https://issues.apache.org/jira/browse/CMIS-896
Project: Chemistry
Issue Type: Improvement
Components: opencmis-server
Affects Versions: OpenCMIS 0.12.0
Reporter: Nicolas Brandt
Priority: Minor
JSON responses of CMIS queries seems to be built in an inefficient way.
{code:java|title=org.apache.chemistry.opencmis.commons.impl.JSONConverter.java}
/**
* Converts a bag of properties.
*/
public static JSONObject convert(final Properties properties, final String objectId, final TypeCache typeCache,
final PropertyMode propertyMode, final boolean succinct, final DateTimeFormat dateTimeFormat) {
if (properties == null) {
return null;
}
// get the type
TypeDefinition type = null;
if (typeCache != null) {
PropertyData<?> typeProp = properties.getProperties().get(PropertyIds.OBJECT_TYPE_ID);
if (typeProp instanceof PropertyId) {
String typeId = ((PropertyId) typeProp).getFirstValue();
if (typeId != null) {
type = typeCache.getTypeDefinition(typeId);
}
}
if (type == null && objectId != null && propertyMode != PropertyMode.CHANGE) {
type = typeCache.getTypeDefinitionForObject(objectId);
}
}
JSONObject result = new JSONObject();
for (PropertyData<?> property : properties.getPropertyList()) {
assert property != null;
assert property.getId() != null;
PropertyDefinition<?> propDef = null;
if (typeCache != null) {
propDef = typeCache.getPropertyDefinition(property.getId());
}
if (propDef == null && type != null) {
propDef = type.getPropertyDefinitions().get(property.getId());
}
if (propDef == null && typeCache != null && objectId != null && propertyMode != PropertyMode.CHANGE) {
typeCache.getTypeDefinitionForObject(objectId);
propDef = typeCache.getPropertyDefinition(property.getId());
}
String propId = (propertyMode == PropertyMode.QUERY ? property.getQueryName() : property.getId());
if (propId == null) {
throw new CmisRuntimeException("No query name or alias for property '" + property.getId() + "'!");
}
result.put(propId, convert(property, propDef, succinct, dateTimeFormat));
}
return result;
}
{code}
According to the quoted source code, building the JSON response of query {{select cmis:objectId, cmis:name from cmis:document}} requires to call the function ObjectService.getObjectById per each row returned.
When the query returns 1000 rows and the CMIS server is backed with a database it causes a significant performance slowdown.
For example with the two following queries (each of them returns 1000 rows):
bq. select * from cmis:document
bq. select cmis:objectId, cmis:name from cmis:document
The second one is more than 5x slower than the first one.
A solution may be to add PropertyType and Cardinality informations into PropertyData objects, so it's no longer necessary to retrieve properties definitions.
I have attached a svn diff file with the changes.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)