Changeset: 3b670c1567fe for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3b670c1567fe Modified Files: monetdb5/extras/rdf/rdflabels.c monetdb5/extras/rdf/rdfretrieval.c monetdb5/extras/rdf/rdfretrieval.h sql/backends/monet5/sql.mx Branch: rdf Log Message:
Clean-up SQLrdfRetrieveSubschema Do not use long int, use GDKmalloc and GDKfree, avoid realloc diffs (truncated from 323 to 300 lines): diff --git a/monetdb5/extras/rdf/rdflabels.c b/monetdb5/extras/rdf/rdflabels.c --- a/monetdb5/extras/rdf/rdflabels.c +++ b/monetdb5/extras/rdf/rdflabels.c @@ -500,7 +500,7 @@ void createSQLMetadata(CSset* freqCSset, for (i = 0; i < freqCSset->numCSadded; ++i) { for (j = 0; j < freqCSset->numCSadded; ++j) { if (matrix[i][j]) { - fprintf(fout, "\"%d\",\"%d\",\"%d\"\n", i, j, matrix[i][j]); + fprintf(fout, "%d,%d,%d\n", i, j, matrix[i][j]); } } } @@ -515,14 +515,14 @@ void createSQLMetadata(CSset* freqCSset, if (!temp) fprintf(stderr, "ERROR: Couldn't malloc memory!\n"); strcpy(temp, labels[i].name); escapeURIforSQL(temp); - fprintf(fout, "\"%d\",\"%s_"BUNFMT"\",\"%d\"\n", i, temp, freqCSset->items[i].csId, freqCSset->items[i].support); // TODO underscores? + fprintf(fout, "%d,\"%s_"BUNFMT"\",%d\n", i, temp, freqCSset->items[i].csId, freqCSset->items[i].support); // TODO underscores? free(temp); } fclose(fout); fout = fopen("CSmetadata.sql", "wt"); - fprintf(fout, "CREATE TABLE table_id_freq (id VARCHAR(10), name VARCHAR(100), frequency VARCHAR(10));\n"); - fprintf(fout, "CREATE TABLE adjacency_list (from_id VARCHAR(10), to_id VARCHAR(10), frequency VARCHAR(10));\n"); + fprintf(fout, "CREATE TABLE table_id_freq (id INTEGER, name VARCHAR(100), frequency INTEGER);\n"); + fprintf(fout, "CREATE TABLE adjacency_list (from_id INTEGER, to_id INTEGER, frequency INTEGER);\n"); fprintf(fout, "COPY INTO table_id_freq from '/export/scratch2/linnea/dbfarm/test/tableIdFreq.csv' USING DELIMITERS ',','\\n','\"';\n"); fprintf(fout, "COPY INTO adjacency_list from '/export/scratch2/linnea/dbfarm/test/adjacencyList.csv' USING DELIMITERS ',','\\n','\"';"); fclose(fout); diff --git a/monetdb5/extras/rdf/rdfretrieval.c b/monetdb5/extras/rdf/rdfretrieval.c --- a/monetdb5/extras/rdf/rdfretrieval.c +++ b/monetdb5/extras/rdf/rdfretrieval.c @@ -24,7 +24,7 @@ #include "rdflabels.h" static -int edgeExists(long int from, long int to, long int* adjacency_from, long int* adjacency_to, int adjacencyCount) { +int edgeExists(int from, int to, int* adjacency_from, int* adjacency_to, int adjacencyCount) { int i; for (i = 0; i < adjacencyCount; ++i) { if (adjacency_from[i] == from && adjacency_to[i] == to) return 1; @@ -33,7 +33,7 @@ int edgeExists(long int from, long int t } static -int getTableIndex(long int id, long int* table_id, int tableCount) { +int getTableIndex(int id, int* table_id, int tableCount) { int i; for (i = 0; i < tableCount; ++i) { if (table_id[i] == id) return i; @@ -42,7 +42,7 @@ int getTableIndex(long int id, long int* } static -NodeStat* initNodeStats1(long int* table_freq, int tableCount) { +NodeStat* initNodeStats1(int* table_freq, int tableCount) { NodeStat* nodeStats = NULL; int i; @@ -60,7 +60,7 @@ NodeStat* initNodeStats1(long int* table } static -void bfs1(int root, long int* table_id, int tableCount, long int* adjacency_from, long int* adjacency_to, int adjacencyCount, int* queue, int* visited, int* isInQueue, int* queuePosition, int* queueLength, NodeStat* nodeStats) { +void bfs1(int root, int* table_id, int tableCount, int* adjacency_from, int* adjacency_to, int adjacencyCount, int* queue, int* visited, int* isInQueue, int* queuePosition, int* queueLength, NodeStat* nodeStats) { int i; for (i = 0; i < tableCount; ++i) { @@ -128,7 +128,7 @@ void bfs1(int root, long int* table_id, } static -void addNode1(long int* adjacency_from, long int* adjacency_to, int adjacencyCount, NodeStat* nodeStats, long int* table_id, int tableCount, int root, char initial) { +void addNode1(int* adjacency_from, int* adjacency_to, int adjacencyCount, NodeStat* nodeStats, int* table_id, int tableCount, int root, char initial) { int queue[tableCount]; // cyclic array int visited[tableCount]; int isInQueue[tableCount]; @@ -183,7 +183,7 @@ void addNode1(long int* adjacency_from, } static -int* retrieval1(int root, int numNodesMax, int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, int adjacencyCount) { +int* retrieval1(int root, int numNodesMax, int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int adjacencyCount) { NodeStat *nodeStats = NULL; int numNodes; int *chosenNodes = NULL; @@ -255,7 +255,7 @@ int* retrieval1(int root, int numNodesMa } static -NodeStat* initNodeStats23(long int* table_freq, int tableCount) { +NodeStat* initNodeStats23(int* table_freq, int tableCount) { NodeStat* nodeStats = NULL; int i; @@ -273,7 +273,7 @@ NodeStat* initNodeStats23(long int* tabl } static -void assignWeightToChildren2(long int* adjacency_from, long int* adjacency_to, int adjacencyCount, NodeStat* nodeStats, long int* table_id, int tableCount, int root) { +void assignWeightToChildren2(int* adjacency_from, int* adjacency_to, int adjacencyCount, NodeStat* nodeStats, int* table_id, int tableCount, int root) { int i, j; // mark root as a "chosen node" @@ -297,7 +297,7 @@ void assignWeightToChildren2(long int* a } static -int* retrieval2(int root, int numNodesMax, int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, int adjacencyCount) { +int* retrieval2(int root, int numNodesMax, int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int adjacencyCount) { NodeStat *nodeStats = NULL; int numNodes; int *chosenNodes = NULL; @@ -366,7 +366,7 @@ int* retrieval2(int root, int numNodesMa } static -void assignWeightToChildren3(long int* adjacency_from, long int* adjacency_to, int adjacencyCount, NodeStat* nodeStats, long int* table_id, int tableCount, int root) { +void assignWeightToChildren3(int* adjacency_from, int* adjacency_to, int adjacencyCount, NodeStat* nodeStats, int* table_id, int tableCount, int root) { int i, j, k; char visited[tableCount]; @@ -409,7 +409,7 @@ void assignWeightToChildren3(long int* a } static -int* retrieval3(int root, int numNodesMax, int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, int adjacencyCount) { +int* retrieval3(int root, int numNodesMax, int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int adjacencyCount) { NodeStat *nodeStats = NULL; int numNodes; int *chosenNodes = NULL; @@ -478,7 +478,7 @@ int* retrieval3(int root, int numNodesMa } static -int* retrieval4(int root, int numNodesMax, int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, long int* adjacency_freq, int adjacencyCount) { +int* retrieval4(int root, int numNodesMax, int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int* adjacency_freq, int adjacencyCount) { int numNodes; int *chosenNodes = NULL; int i, j; @@ -556,7 +556,7 @@ int* retrieval4(int root, int numNodesMa } static -char** initEdgesOverview(long int* table_id, int tableCount, long int* adjacency_from, long int* adjacency_to, int adjacencyCount) { +char** initEdgesOverview(int* table_id, int tableCount, int* adjacency_from, int* adjacency_to, int adjacencyCount) { char **edges; int i, j; @@ -573,8 +573,8 @@ char** initEdgesOverview(long int* table } for (i = 0; i < adjacencyCount; ++i) { - long int from = adjacency_from[i]; - long int to = adjacency_to[i]; + int from = adjacency_from[i]; + int to = adjacency_to[i]; int fromIdx = -1; int toIdx = -1; @@ -600,7 +600,7 @@ int compareOverviewNodes (const void * a } static -int* retrievalOverview(int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, int adjacencyCount) { +int* retrievalOverview(int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int adjacencyCount) { int i, j, k; char **edges; int sumSubjects = 0; @@ -800,7 +800,7 @@ int* retrievalOverview(int* numNodesActu return chosenNodes; } -int* retrieval(int root, int numNodesMax, int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, long int* adjacency_freq, int adjacencyCount) { +int* retrieval(int root, int numNodesMax, int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int* adjacency_freq, int adjacencyCount) { if (SUBSCHEMA_HEURISTIC == 5) { (void) numNodesMax; (void) root; diff --git a/monetdb5/extras/rdf/rdfretrieval.h b/monetdb5/extras/rdf/rdfretrieval.h --- a/monetdb5/extras/rdf/rdfretrieval.h +++ b/monetdb5/extras/rdf/rdfretrieval.h @@ -47,6 +47,6 @@ typedef struct Groups { #define SUBSCHEMA_HEURISTIC 5 rdf_export int* -retrieval(int root, int numNodesMax, int* numNodesActual, long int* table_id, str* table_name, long int* table_freq, int tableCount, long int* adjacency_from, long int* adjacency_to, long int* adjacency_freq, int adjacencyCount); +retrieval(int root, int numNodesMax, int* numNodesActual, int* table_id, str* table_name, int* table_freq, int tableCount, int* adjacency_from, int* adjacency_to, int* adjacency_freq, int adjacencyCount); #endif /* _RDFRETRIEVAL_H_ */ diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx --- a/sql/backends/monet5/sql.mx +++ b/sql/backends/monet5/sql.mx @@ -7779,21 +7779,17 @@ SQLrdfRetrieveSubschema(Client cntxt, Ma BAT *table_id_freq_id, *table_id_freq_name, *table_id_freq_freq; BAT *adjacency_list_from, *adjacency_list_to, *adjacency_list_freq; - BATiter table_id_freq_id_i, table_id_freq_name_i, table_id_freq_freq_i; - BATiter adjacency_list_from_i, adjacency_list_to_i, adjacency_list_freq_i; + BATiter table_id_freq_name_i; BUN p, q; - BUN p2, q2; - BUN bun, bun2, bun3; - BUN bun4, bun5, bun6; - - int tableCount = 0; - long int *table_id = NULL; + + BUN tableCount = 0; + int *table_id = NULL; str *table_name = NULL; - long int *table_freq = NULL; - long int *adjacency_from = NULL; - long int *adjacency_to = NULL; - long int *adjacency_freq = NULL; - int adjacencyCount = 0; + int *table_freq = NULL; + int *adjacency_from = NULL; + int *adjacency_to = NULL; + int *adjacency_freq = NULL; + BUN adjacencyCount = 0; int root; int countActual; @@ -7813,53 +7809,33 @@ SQLrdfRetrieveSubschema(Client cntxt, Ma adjacency_list_to = mvc_bind(m, "sys", "adjacency_list", "to_id", 0); adjacency_list_freq = mvc_bind(m, "sys", "adjacency_list", "frequency", 0); - table_id_freq_id_i = bat_iterator(table_id_freq_id); + tableCount = BATcount(table_id_freq_id); + table_name = GDKmalloc(sizeof(str) * tableCount); + + if (!table_name) { + BBPreclaim(table_id_freq_id); + BBPreclaim(table_id_freq_name); + BBPreclaim(table_id_freq_freq); + BBPreclaim(adjacency_list_from); + BBPreclaim(adjacency_list_to); + BBPreclaim(adjacency_list_freq); + throw(SQL, "sql.rdfRetrieveSubschema", "ERROR: Couldn't GDKmalloc table_name array!\n"); + } + + table_id = (int*) Tloc(table_id_freq_id, BUNfirst(table_id_freq_id)); + table_freq = (int*) Tloc(table_id_freq_freq, BUNfirst(table_id_freq_freq)); table_id_freq_name_i = bat_iterator(table_id_freq_name); - table_id_freq_freq_i = bat_iterator(table_id_freq_freq); - adjacency_list_from_i = bat_iterator(adjacency_list_from); - adjacency_list_to_i = bat_iterator(adjacency_list_to); - adjacency_list_freq_i = bat_iterator(adjacency_list_freq); - - bun = BUNfirst(table_id_freq_id); - bun2 = BUNfirst(table_id_freq_name); - bun3 = BUNfirst(table_id_freq_freq); - bun4 = BUNfirst(adjacency_list_from); - bun5 = BUNfirst(adjacency_list_to); - bun6 = BUNfirst(adjacency_list_freq); - - // store data - BATloop(table_id_freq_id, p, q) { - str id = (str) BUNtail(table_id_freq_id_i, bun + tableCount); - str name = (str) BUNtail(table_id_freq_name_i, bun2 + tableCount); - str freq = (str) BUNtail(table_id_freq_freq_i, bun3 + tableCount); - - table_id = realloc(table_id, sizeof(long int) * (tableCount + 1)); - table_name = realloc(table_name, sizeof(str) * (tableCount + 1)); - table_freq = realloc(table_freq, sizeof(long int) * (tableCount + 1)); - if (!table_id || !table_name || !table_freq) fprintf(stderr, "ERROR: Couldn't realloc memory!\n"); - - table_id[tableCount] = strtol(id, NULL, 10); - table_name[tableCount] = name; - table_freq[tableCount]= strtol(freq, NULL, 10); - tableCount += 1; - } - - // store data - BATloop(adjacency_list_from, p2, q2) { - str from = (str) BUNtail(adjacency_list_from_i, bun4 + adjacencyCount); - str to = (str) BUNtail(adjacency_list_to_i, bun5 + adjacencyCount); - str freq = (str) BUNtail(adjacency_list_freq_i, bun6 + adjacencyCount); - - adjacency_from = realloc(adjacency_from, sizeof(long int) * (adjacencyCount + 1)); - adjacency_to = realloc(adjacency_to, sizeof(long int) * (adjacencyCount + 1)); - adjacency_freq = realloc(adjacency_freq, sizeof(long int) * (adjacencyCount + 1)); - if (!adjacency_from || !adjacency_to || !adjacency_freq) fprintf(stderr, "ERROR: Couldn't realloc memory!\n"); - - adjacency_from[adjacencyCount] = strtol(from, NULL, 10); - adjacency_to[adjacencyCount] = strtol(to, NULL, 10); - adjacency_freq[adjacencyCount] = strtol(freq, NULL, 10); - adjacencyCount += 1; - } + + tableCount = 0; + BATloop(table_id_freq_name, p, q) { + table_name[tableCount++] = (str) BUNtail(table_id_freq_name_i, p); + } + + adjacencyCount = BATcount(adjacency_list_from); + + adjacency_from = (int*) Tloc(adjacency_list_from, BUNfirst(adjacency_list_from)); + adjacency_to = (int*) Tloc(adjacency_list_to, BUNfirst(adjacency_list_to)); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list