/*- * ============LICENSE_START======================================================= * ONAP - SO * ================================================================================ * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.aaiclient.client.graphinventory.entities; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.onap.aaiclient.client.aai.entities.QueryStep; import org.onap.aaiclient.client.graphinventory.GraphInventoryObjectName; import com.google.common.base.Joiner; public class DSLQueryBuilder { private List steps = new ArrayList<>(); private String suffix = ""; protected DSLQueryBuilder() { } protected DSLQueryBuilder(QueryStep node) { steps.add(node); } public DSLQueryBuilder> node(DSLNodeBase node) { steps.add(node); return (DSLQueryBuilder>) this; } public DSLQueryBuilder output() { Object obj = steps.get(steps.size() - 1); if (obj instanceof DSLNodeBase) { ((DSLNodeBase) steps.get(steps.size() - 1)).output(); } else if (obj.getClass().getName().contains("$$Lambda$")) { // process lambda expressions for (Field f : obj.getClass().getDeclaredFields()) { f.setAccessible(true); Object o; try { o = f.get(obj); if (o instanceof DSLQueryBuilder && ((DSLQueryBuilder) o).steps.get(0) instanceof DSLNodeBase) { ((DSLNodeBase) ((DSLQueryBuilder) o).steps.get(0)).output(); } } catch (IllegalArgumentException | IllegalAccessException e) { } f.setAccessible(false); break; } } return (DSLQueryBuilder) this; } @SafeVarargs public final DSLQueryBuilder union(final DSLQueryBuilder... union) { List> unions = Arrays.asList(union); steps.add(() -> { StringBuilder query = new StringBuilder(); query.append("> [ ") .append(Joiner.on(", ") .join(unions.stream().map(item -> item.compile()).collect(Collectors.toList()))) .append(" ]"); return query.toString(); }); return (DSLQueryBuilder) this; } public DSLQueryBuilder where(DSLQueryBuilder where) { steps.add(() -> { StringBuilder query = new StringBuilder(); query.append(where.compile()).append(")"); String result = query.toString(); if (!result.startsWith(">")) { result = "> " + result; } return "(" + result; }); return this; } public DSLQueryBuilder to(DSLQueryBuilder to) { steps.add(() -> { StringBuilder query = new StringBuilder(); query.append("> ").append(to.compile()); return query.toString(); }); return (DSLQueryBuilder) this; } public DSLQueryBuilder to(GraphInventoryObjectName name) { return (DSLQueryBuilder) to(__.node(name)); } public DSLQueryBuilder to(GraphInventoryObjectName name, DSLNodeKey... key) { return (DSLQueryBuilder) to(__.node(name, key)); } public DSLQueryBuilder limit(int limit) { suffix = " LIMIT " + limit; return this; } public DSLTraversal build() { return new DSLTraversal<>(compile()); } @Override public String toString() { return build().get(); } @Override public boolean equals(Object o) { if (o != null) { return o.toString().equals(toString()); } return false; } @Override public int hashCode() { return compile().hashCode(); } private String compile() { return String.join(" ", steps.stream().map(item -> item.build()).collect(Collectors.toList())) + suffix; } protected QueryStep getFirst() { return steps.get(0); } }