Код настройки производительности в O (n^2), чтобы быть более производительным

У меня есть этот весенний загрузочный java-контроллер с кодом, который использует API управления документами OpenKM для поиска документов в системе управления документами и отображения результатов с использованием таблиц данных Ajax, HTML, CSS и Jquery на внешнем интерфейсе.

Из-за способа написания API я не могу получить объект документа с его метаданными за один вызов, но мне нужно будет использовать вывод вызова первой операции API в качестве фильтра для другого метода операции API в двух вложенных циклах for.

Кроме того, мне пришлось перебрать метод toString объекта возврата API, чтобы получить информацию о метаданных, поскольку они не были доступны через свойства возвращаемого объекта.

Проблема заключается в производительности этого кода. Я хотел бы видеть, есть ли способ оптимизировать этот код.

    // Read the property or metadata to use in constituting the StoredDocument object
    for (QueryResult queryResult : resultSet.getResults()) {
        // Create a locally-scoped List<String>
        List<String> listOfStoredDocumentProperties = new ArrayList<String>();
        Document document = queryResult.getDocument();
        String nodeId = document.getPath();
        // Populate storedDocument object
        storedDocument = new StoredDocument();
        storedDocument.setAuthor(document.getAuthor());
        storedDocument.setCreated(document.getCreated());
        storedDocument.setLastModified(document.getLastModified());
        storedDocument.setPath(document.getPath());
        storedDocument.setPermissions(document.getPermissions());
        storedDocument.setSize(document.getActualVersion().getSize());
        storedDocument.setUuid(document.getUuid());
        storedDocument.setVersionNumber(document.getActualVersion().getName());
        // System.out.println(nodeId);
        try {
            listOfFormElement = okm.getPropertyGroupProperties(nodeId, documentVo.getGroupId());
            int counterForTrackingDocDirectionPos = 0;
            for (FormElement formElement : listOfFormElement) {
                ++counterForTrackingDocDirectionPos;
                if (counterForTrackingDocDirectionPos == 4) {
                    String formElementString = formElement.toString();
                    // System.out.println("formElementString: " + formElementString);
                    System.out.println("name: " + formElement.getName());
                    System.out.println("formElement: " + formElement);
                    String transformedFormElementString = StringUtils.EMPTY;
                    try {
                        transformedFormElementString = formElementString.substring(0, formElementString.indexOf(", selected=true"));
                        // Read the string from a position that is 3 steps before the last position in the string.
                        transformedFormElementString = transformedFormElementString
                                .substring(transformedFormElementString.length() - 3, transformedFormElementString.length()).trim();
                        transformedFormElementString = transformedFormElementString.startsWith("=")
                                ? transformedFormElementString.substring(1, transformedFormElementString.length()) : transformedFormElementString;
                    } catch (Exception ex) {
                        // To catch scenario where formElementString.indexOf(", selected=true") does not find the
                        // specified string. This happens when document direction is not set and therefore is
                        // selected=false for both the options IN and OUT.
                        transformedFormElementString = "NOT SET";
                    }
                    listOfStoredDocumentProperties.add(transformedFormElementString);
                    System.out.println("transformedFormElementString: " + transformedFormElementString);
                } else {
                    String formElementString = formElement.toString();
                    String transformedFormElementString = formElementString.substring(formElementString.indexOf("value="),
                            formElementString.indexOf("data="));
                    // Remove the preceding 'value=' and the last 2 character-constituted string ", "
                    transformedFormElementString = transformedFormElementString.substring(6, transformedFormElementString.length() - 2).trim();
                    listOfStoredDocumentProperties.add(transformedFormElementString);
                }
            }
            storedDocument.setCompanyName(listOfStoredDocumentProperties.get(0));
            storedDocument.setProductLine(listOfStoredDocumentProperties.get(1));
            storedDocument.setSubjectHeading(listOfStoredDocumentProperties.get(2));
            storedDocument.setDocumentDirection(listOfStoredDocumentProperties.get(3));
            storedDocument.setDocumentType(listOfStoredDocumentProperties.get(4));
            storedDocument.setReferenceNumber(listOfStoredDocumentProperties.get(5));
            storedDocument.setDate(ISO8601.parseBasic(listOfStoredDocumentProperties.get(6)).getTime().toString());
            // Add the storedDocument object to the return list
            listOfstoredDocuments.add(storedDocument);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchGroupException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (PathNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RepositoryException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (DatabaseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknowException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (WebserviceException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

1 ответ

Решением для этого является расширение REST API. В профессиональной редакции REST API расширяется за счет архитектуры плагинов https://docs.openkm.com/kcenter/view/okm-6.4/creating-your-own-rest-plugin-(-extending-rest-api-).html, в сообществе этой опции еще нет. Идея состоит в том, чтобы создать метод со стороны сервера, который предоставит точные данные, которые вам действительно нужны, создав методы высокого уровня.

Другие вопросы по тегам