package rocks.inspectit.shared.cs.indexing.query.factory.impl; import java.sql.Timestamp; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import org.springframework.stereotype.Component; import rocks.inspectit.shared.all.indexing.IIndexQuery; import rocks.inspectit.shared.all.tracing.data.ClientSpan; import rocks.inspectit.shared.all.tracing.data.ServerSpan; import rocks.inspectit.shared.all.tracing.data.SpanIdent; import rocks.inspectit.shared.cs.indexing.query.factory.AbstractQueryFactory; import rocks.inspectit.shared.cs.indexing.restriction.impl.IndexQueryRestrictionFactory; /** * Query factory for the spans. * * @param <E> * Query type. * @author Ivan Senic * */ @Component public class SpanQueryFactory<E extends IIndexQuery> extends AbstractQueryFactory<E> { /** * List of span classes used in the queries. */ private static final List<Class<?>> CLASSES_LIST = Collections.unmodifiableList(Arrays.<Class<?>> asList(ServerSpan.class, ClientSpan.class)); /** * Returns query for searching root spans. * * @param fromDate * From date to search for. Can be <code>null</code> not to set any boundary. * @param toDate * To date to search for. Can be <code>null</code> not to set any boundary. * @return Query */ public E getRootSpansQuery(Date fromDate, Date toDate) { E query = getIndexQueryProvider().getIndexQuery(); // set classes searched query.setObjectClasses(CLASSES_LIST); // only root spans query.addIndexingRestriction(IndexQueryRestrictionFactory.equal("spanIdent.root", true)); // set time bounds if (fromDate != null) { query.setFromDate(new Timestamp(fromDate.getTime())); } if (toDate != null) { query.setToDate(new Timestamp(toDate.getTime())); } return query; } /** * Returns query for searching spans that belong to the same trace. * * @param traceId * Trace id. * @return Query */ public E getSpans(long traceId) { E query = getIndexQueryProvider().getIndexQuery(); // set classes searched query.setObjectClasses(CLASSES_LIST); // only spans in the trace spans query.addIndexingRestriction(IndexQueryRestrictionFactory.equal("spanIdent.traceId", traceId)); return query; } /** * Returns query for getting span with given ident. * * @param spanIdent * {@link SpanIdent}. * @return Query */ public E get(SpanIdent spanIdent) { E query = getIndexQueryProvider().getIndexQuery(); // set classes searched query.setObjectClasses(CLASSES_LIST); // only span with specific id query.addIndexingRestriction(IndexQueryRestrictionFactory.equal("spanIdent.id", spanIdent.getId())); return query; } }