[ https://issues.apache.org/jira/browse/CMIS-896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14350347#comment-14350347 ]
Nicolas Brandt commented on CMIS-896: ------------------------------------- Oh I'm sorry that you thought I wanted you to apply the patch I submitted as this. It was not the case (unless you found it was good enough). And, of course it will be best to find a less intrusive change (and certainly a more efficient one). > 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 > Assignee: Florian Müller > Priority: Minor > Attachments: query.patch > > > 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)