[
https://issues.apache.org/jira/browse/CMIS-896?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14349187#comment-14349187
]
Nicolas Brandt commented on CMIS-896:
-------------------------------------
I don't doubt that there is a better way to do it than the one I submitted :).
And yes, we could provide cmis:objectTypeId but, unless I misunderstood the
spec, it is only allowed in this case (section 2.1.14.1.3 of the spec) :
{quote}
If the select clause of the query statement contains properties from a single
type reference then the repository
MAY represent these pseudo-objects with additional object information.
{quote}
So we can't do that for query like this one :\\
{noformat}select doc.cmis:objectId, sec.aProperty from cmis:document doc inner
join aSecondaryType sec on sec.cmis:objectId = doc.cmis:objectId{noformat}
And even if the end user add {{doc.cmis:objectTypeId}} into the SELECT clause
of the previous query, the performance slowdown is still here because of
{{sec.aProperty}}.
> 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)