import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.Executor;
-
-import org.apache.commons.lang3.NotImplementedException;
import org.onap.music.exceptions.MDBCServiceException;
import org.onap.music.exceptions.QueryException;
import org.onap.music.logging.EELFLoggerDelegate;
import org.onap.music.mdbc.query.QueryProcessor;
import org.onap.music.mdbc.query.SQLOperation;
import org.onap.music.mdbc.query.SQLOperationType;
-import org.onap.music.mdbc.tables.MusicTxDigestDaemon;
import org.onap.music.mdbc.tables.MusicRangeInformationRow;
import org.onap.music.mdbc.tables.StagingTable;
import org.onap.music.mdbc.tables.TxCommitProgress;
* @param sql the SQL statement that is about to be executed
*/
public void preStatementHook(final String sql) throws MDBCServiceException, SQLException {
+
+ // some debug specific logic
+ if(sql.startsWith("DEBUG")) {
+ // if the SQL follows this convention: "DEBUG:TABLE_A,TABLE_B",
+ // DAG information pertaining to the tables will get printed
+ throw new SQLException("\nThis call was made for debugging purposes only\n" + statemanager.getOwnAndCheck().getDebugInfo(mi,sql.split(":")[1]));
+ }
+
//TODO: verify ownership of keys here
//Parse tables from the sql query
Map<String, List<SQLOperation>> tableToQueryType = QueryProcessor.parseSqlQuery(sql, table_set);
addNewNode(row,dependencies);
}
+ /**
+ *
+ * @return All ranges in every node of the DAG
+ */
public Set<Range> getAllRanges(){
Set<Range> ranges = new HashSet<>();
for(DagNode node : nodes.values()){
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.lang3.tuple.Pair;
import org.onap.music.exceptions.MDBCServiceException;
import org.onap.music.logging.EELFLoggerDelegate;
import org.onap.music.mdbc.mixins.LockResult;
import org.onap.music.mdbc.mixins.MusicInterface;
import org.onap.music.mdbc.mixins.MusicInterface.OwnershipReturn;
-import org.onap.music.mdbc.mixins.MusicMixin;
import org.onap.music.mdbc.query.SQLOperationType;
import org.onap.music.mdbc.tables.MriReference;
import org.onap.music.mdbc.tables.MusicRangeInformationRow;
}
}
+ public String getDebugInfo(MusicInterface mi, String rangesStr) {
+
+ List<Range> ranges = new ArrayList<Range>();
+ Arrays.stream(rangesStr.split(",")).forEach(a -> ranges.add(new Range(a)));
+
+ StringBuffer buffer = new StringBuffer();
+ List<Range> rangesToOwn;
+ try {
+ rangesToOwn = mi.getRangeDependencies(ranges);
+ List<MusicRangeInformationRow> rangesToOwnRows = extractRowsForRange(mi,rangesToOwn, false);
+ Dag toOwn = Dag.getDag(rangesToOwnRows,rangesToOwn);
+ while(toOwn.hasNextToOwn()){
+ DagNode node = null;
+ try {
+ node = toOwn.nextToOwn();
+ MusicRangeInformationRow row = node.getRow();
+
+ buffer.append("\n-------------\n");
+ buffer.append(row.getDBPartition()).append(",");
+ buffer.append(row.getPrevRowIndexes()).append(",");
+ buffer.append(row.getIsLatest()).append("");
+
+
+ } catch (Exception e) {
+ buffer.append("\n------missing MRI------\n");
+ } finally {
+
+ if(node != null) {
+ toOwn.setOwn(node);
+ }
+
+ }
+
+ }
+
+
+ } catch (MDBCServiceException e) {
+ buffer.setLength(0);
+ buffer.append(" Debugging info could not be determined");
+ }
+
+ return buffer.toString();
+
+ }
+
public void reloadAlreadyApplied(DatabasePartition partition) throws MDBCServiceException {
List<Range> snapshot = partition.getSnapshot();
import org.apache.calcite.sql.SqlJoin;
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlOrderBy;
import org.apache.calcite.sql.SqlSelect;
import org.apache.calcite.sql.SqlUpdate;
import org.apache.calcite.sql.fun.SqlInOperator;
case SELECT:
parseSelect((SqlSelect) sqlNode, tableOpsMap);
break;
+ case ORDER_BY:
+ parseSelect((SqlSelect)((SqlOrderBy) sqlNode).query, tableOpsMap);
+ break;
default:
logger.error("Unhandled sql query type " + sqlNode.getKind() +" for query " + query);
}