Project

General

Profile

Statistics
| Revision:

# Date Author Comment
3749 08/02/2012 04:16 PM Aaron Marcuse-Kubitza

strings.py: concat(): Convert args to raw (non-Unicode) strings first, so that multi-byte Unicode sequences are considered by # of bytes instead of # of chars. This is necessary because PostgreSQL truncates identifiers by # of bytes instead of # of chars, so that identifiers will actually be less than 63 chars long when some chars were multi-byte.

3748 08/02/2012 04:11 PM Aaron Marcuse-Kubitza

strings.py: ustr(): Call str() method manually like urepr() to avoid Unicode errors when the returning string is non-ASCII

3747 08/02/2012 03:54 PM Aaron Marcuse-Kubitza

strings.py: Added urepr() and use it in repr_no_u(), to better support repr() return values with non-ASCII characters. Avoiding repr() also provides a more complete stack trace in the case of such errors.

3746 08/01/2012 11:37 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: plantobservation: plantobservation_aggregateoccurrence_count_1() trigger: Don't raise an error if existing count was >1, because there are in fact datasets (notably SALVIAS) where input records for individual stems may themselves contain aggregate data (such as plant and stem counts). For this data, we have an anomalous condition where an aggregateoccurrence has count >1 but contains one plantobservation, due to the plant/stem count being included in the first stem's record. (See <https://projects.nceas.ucsb.edu/nceas/projects/bien/wiki/SALVIAS_issues#Data-interpretation-issues> for more info on this problem.) Note that our desired 1:1 relationship between aggregateoccurrence and plantobservation is still guaranteed by a constraint, but the anomalous data may still cause irregularities later on in the analysis.

3745 08/01/2012 10:55 AM Aaron Marcuse-Kubitza

sql_io.py: put_table(): Ignoring all rows on unrecoverable errors: Also support the case where has_joins == True, by setting it to False so that the no-joins case is effectively used

3744 08/01/2012 10:32 AM Aaron Marcuse-Kubitza

inputs/import.stats.xls: Moved Simultaneously above Independently because that is how we are now running the imports

3743 08/01/2012 10:21 AM Aaron Marcuse-Kubitza

Regenerated vegbien.ERD exports

3742 08/01/2012 09:50 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: 1_to_1 and *_unique_within unique indexes with a `WHERE sourceaccessioncode IS NULL` filter: Added IS NULL filters for other unique keys, so that these fallback indexes would only be used if there was no (or no other) way to uniquely identify their tables. For *_1_to_1 unique indexes, this is the case for specimens data.

3741 08/01/2012 09:48 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: 1_to_1 and *_unique_within unique indexes with a `WHERE sourceaccessioncode IS NULL` filter: Added IS NULL filters for other unique keys, so that these fallback indexes would only be used if there was no (or no other) way to uniquely identify their tables. For *_1_to_1 unique indexes, this is the case for specimens data.

3740 08/01/2012 09:41 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: stemobservation: Replaced stemobservation_unique_code unique constraint with stemobservation_unique_within_plantobservation unique index that uses COALESCE and WHERE ... IS NOT NULL appropriately, to work with sql_gen's use of COALESCE indexes and (for the renaming) to better reflect what it does

3739 08/01/2012 09:36 AM Aaron Marcuse-Kubitza

schemas/vegbien.ERD.mwb: Synced with schema

3738 08/01/2012 09:30 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: 1_to_1 and *_unique_within unique indexes intended to operate only when sourceaccessioncode is NULL: Changed to use `sourceaccessioncode IS NULL` WHERE condition instead of COALESCE element, since the sourceaccessioncode is not actually needed for the uniquification (it is already globally unique within the datasource if it's not NULL; this just covers the case where it is NULL)

3737 08/01/2012 09:23 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: unique_within unique indexes used for 1:1 relationships: Renamed to __1_to_1 to better reflect what they do

3736 08/01/2012 09:21 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: unique_within unique indexes used for 1:1 relationships: Renamed to __1_to_1 to better reflect what they do

3735 08/01/2012 08:58 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: plantobservation: Corrected plantobservation_aggregateoccurrence_id_1_to_1's name to plantobservation_aggregateoccurrence_1_to_1 because it's 1:1 with aggregateoccurrence, not aggregateoccurrence_id. Made it a unique index for consistency with our general method of expressing unique constraints on potentially nullable columns.

3734 08/01/2012 08:54 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: specimenreplicate: Renamed specimenreplicate_unique_plantobservation to specimenreplicate_plantobservation_1_to_1 to better reflect what it does

3733 08/01/2012 08:50 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: locationevent unique indexes: Renamed to unique_within to better reflect what they do

3732 08/01/2012 08:34 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: location: Removed redundant location_unique_sourceaccessioncode unique constraint, which has been replaced by location_unique_within_datasource

3731 08/01/2012 08:31 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: Reset foreign key constraint names to autogenerated defaults for consistency

3730 08/01/2012 08:27 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: Renamed *_unique_datasource unique indexes to *_unique_within_datasource to better reflect what they do

3729 08/01/2012 08:25 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: locationevent: Renamed locationevent_unique_accessioncode to locationevent_unique_within_location to better reflect what it does

3728 08/01/2012 08:22 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: specimenreplicate: Renamed specimenreplicate_unique_accessioncode to specimenreplicate_unique_within_datasource to better reflect what it does

3727 08/01/2012 08:11 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: stemobservation: Renamed stemobservation_unique_accessioncode to stemobservation_unique_within_plantobservation and also apply it to NULL sourceaccessioncodes, so that a plantobservation can have a single stemobservation for its single stem's traits without needing a separate sourceaccessioncode for it

3726 08/01/2012 08:02 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: aggregateoccurrence: Removed redundant aggregateoccurrence_unique_accessioncode unique constraint, which has been replaced by aggregateoccurrence_unique_within_taxonoccurrence

3725 08/01/2012 07:43 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: plantnamescope: Added CHECK constraint to ensure that at least one key column is specified (an empty plantnamescope doesn't make sense; use NULL instead)

3724 08/01/2012 07:32 AM Aaron Marcuse-Kubitza

schemas/vegbien.ERD.mwb: Synced with schema

3723 08/01/2012 07:23 AM Aaron Marcuse-Kubitza

ch_root: Don't require both the input and output mappings to contain their respective new roots, since sometimes only one or the other root is being subset. This will occur, for example, in mappings that are flat on the input but normalized on the output, such as VegCSV.

3722 08/01/2012 07:06 AM Aaron Marcuse-Kubitza

VegBIEN: Reversed aggregateoccurrence<->plantobservation relationship to point from plantobservation->aggregateoccurrence, so plantobservation could be scoped by aggregateoccurrence in the same way as all other core tables are scoped by their parent tables. This reversed direction was an anomaly due to the need to have a trigger auto-set aggregateoccurrence.count to 1 when there was an associated plantobservation. This was most easily accomplished on the aggregateoccurrence table itself, but required the reversed relationship. The trigger has now been reimplemented on plantobservation, which externally updates aggregateoccurrence.count.

3721 08/01/2012 06:53 AM Aaron Marcuse-Kubitza

input.Makefile: Testing: diffing test outputs: Ignore changes in whitespace, due to e.g. different indent levels. This facilitates accepting tests when an element has been nested inside another element (or unnested), by showing only the opening and closing tags of the new outer element.

3720 08/01/2012 06:42 AM Aaron Marcuse-Kubitza

dicts.py: DictProxy: Fixed bug where default value for inner param needed to be created in the constructor, or else every default instance would use and modify the same dictionary

3719 08/01/2012 06:26 AM Aaron Marcuse-Kubitza

db_xml.py: put(): wrap_e(): Call augment_error() to add the current node to the error message

3718 08/01/2012 06:14 AM Aaron Marcuse-Kubitza

db_xml.py: put(): Raise an error if there are multiple fields with the same name, instead of silently overwriting the first with the second. This generally indicates the need to use `:[@merge=1]` on the fields in question.

3717 08/01/2012 06:11 AM Aaron Marcuse-Kubitza

dicts.py: Added OnceOnlyDict and helper exception KeyExistsError

3716 08/01/2012 06:10 AM Aaron Marcuse-Kubitza

dicts.py: DictProxy: Added default value for inner param to facilitate creating empty wrapped dicts

3715 08/01/2012 05:48 AM Aaron Marcuse-Kubitza

bin/map: out_is_db: row-based mode: Debug-log the processed XML tree produced by xml_func.process()

3714 08/01/2012 05:16 AM Aaron Marcuse-Kubitza

sql_io.py: put_table(): Fixed bug where Missing mapping for NOT NULL column errors should actually be warnings because sometimes the mappings include extra tables which aren't used by the dataset

3713 08/01/2012 05:12 AM Aaron Marcuse-Kubitza

sql_io.py: put_table(): Fixed bug where Missing mapping for NOT NULL column errors should actually be warnings because sometimes the mappings include extra tables which aren't used by the dataset

3712 08/01/2012 03:18 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: aggregateoccurrence: Added UNIQUE INDEX that makes an aggregateoccurrence unique within a taxonoccurrence. When the sourceaccessioncode isn't specified (as for individual organisms data, where this goes in plantobservation and taxonoccurrence), this ensures a 1:1 relationship between aggregateoccurrence and taxonoccurrence.

3711 08/01/2012 03:08 AM Aaron Marcuse-Kubitza

schemas/vegbien.sql: taxonoccurrence: Added UNIQUE INDEX that makes a taxonoccurrence unique within a locationevent. When the sourceaccessioncode isn't specified (as for specimens data), this ensures a 1:1 relationship between taxonoccurrence and locationevent.

3710 08/01/2012 03:05 AM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: binomial (full) plantname: Also mapped to an alternative for taxonoccurrence.sourceaccessioncode, for aggregate plots data that distinguishes taxonoccurrences only by plantname (such as CVS)

3709 08/01/2012 02:23 AM Aaron Marcuse-Kubitza

exc.py: e_msg(): Fixed bug where exceptions with nothing in e.args (such as StopIteration) caused a failed assertion. Fixed bug where exceptions with multiple values in e.args (such as certain IOErrors) caused a failed assertion.

3708 08/01/2012 01:27 AM Aaron Marcuse-Kubitza

sql.py: flatten(): Documented that shouldn't cache query because the temp table will usually be truncated after use

3707 08/01/2012 01:05 AM Aaron Marcuse-Kubitza

sql_gen.py: merge_not_null(): For clarity, use to_text() to represent NULL as the string 'NULL' instead of as the null sentinel for the column's type

3706 08/01/2012 01:02 AM Aaron Marcuse-Kubitza

sql_gen.py: Added to_text() and helper value null_as_str

3705 08/01/2012 12:52 AM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: plantobservation: sourceaccessioncode, authorplantcode: Removed no longer needed mapping to specimenreplicate.sourceaccessioncode, since specimenreplicate for plots data is now identified by its plantobservation fkey, without needing its own sourceaccessioncode

3704 07/31/2012 10:41 PM Aaron Marcuse-Kubitza

sql_io.py: put_table(): ignore_cond(): Fixed bug where if is_literals, need to return NULL, instead of trying to filter invalid rows out of a nonexistant input table

3703 07/31/2012 09:57 PM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: Replaced "/}" (with unnecessary "/") with "}"

3702 07/31/2012 09:51 PM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: Replaced doubled "/"s with single "/"

3701 07/31/2012 09:05 PM Aaron Marcuse-Kubitza

backups/Makefile: Added synchronization of backups with vegbiendev. Added downloading backups to After a new import steps.

3700 07/31/2012 09:04 PM Aaron Marcuse-Kubitza

lib/common.Makefile: rsync: $(remote): Fixed bug where the inputs/ dir was hardcoded, when the remote dir name needed to be determined dynamically based on the Makefile dir

3699 07/31/2012 08:54 PM Aaron Marcuse-Kubitza

backups/Makefile: Refactored to include lib/common.Makefile

3698 07/31/2012 08:46 PM Aaron Marcuse-Kubitza

inputs/Makefile: Added download-logs to download import logs onto local machine and added it to the "After a new import" steps

3697 07/31/2012 08:36 PM Aaron Marcuse-Kubitza

Moved generally useful targets and vars from inputs/Makefile to lib/common.Makefile and lib/forwarding.Makefile

3696 07/31/2012 08:04 PM Aaron Marcuse-Kubitza

bin/map: Don't create unneeded /_ignore/inLabel element containing the datasource name because sql_io.put_table() now autopopulates the datasource_id

3695 07/31/2012 07:57 PM Aaron Marcuse-Kubitza

schemas/functions.sql, py_functions.sql: Removed no longer needed relational functions, since sql_io.put_table() supports regular SQL functions

3694 07/30/2012 08:31 PM Aaron Marcuse-Kubitza

inputs/Madidi/maps/VegX.plots.csv: Mapped all mappable columns

3693 07/30/2012 08:28 PM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: elevation, elevationrange: Added _rangeStart/_rangeEnd filter

3692 07/30/2012 08:19 PM Aaron Marcuse-Kubitza

sql_io.py: Wrapping mapping in a sql_gen.ColDict: Documented that sql_gen.ColDict sanitizes both keys and values passed into it

3691 07/30/2012 08:18 PM Aaron Marcuse-Kubitza

sql_gen.py: ColDict: Documented that anything that isn't a column is wrapped in a NamedCol

3690 07/30/2012 08:04 PM Aaron Marcuse-Kubitza

README.TXT: Datasource setup: Accepting the test cases: Added instructions for what to do if you get errors

3689 07/30/2012 06:09 PM Aaron Marcuse-Kubitza

bin/map: Fixed bug where needed to use sql.function_exists() to determine if something is a relational (now SQL) function, including in row-based mode, since that now uses sql_io.put_table(), which requires this. The bug fix relies on the new xml_func.process() feature that preserves unknown relational functions in case they are built-in functions rather than SQL functions.

3688 07/30/2012 06:04 PM Aaron Marcuse-Kubitza

xml_func.py: process(): In row-based mode, when trying to evaluate function using DB, preserve unknown funcs because these might be built-in functions of db_xml.put(). The sql.DoesNotExistException should be raised again when db_xml.put() is run and it verifies whether the function is built-in or not (e.g. _simplifyPath is now built-in, for column-based support). See db_xml.put_special_funcs for built-in functions.

3687 07/30/2012 05:59 PM Aaron Marcuse-Kubitza

db_xml.py: put(): Fixed bug where strings starting with "$" were interpreted as input columns in row-based mode (this should only apply to column-based mode). Explicitly store whether in row-based mode in is_literals var (similar to is_literals in sql_io.put_table()).

3686 07/30/2012 05:54 PM Aaron Marcuse-Kubitza

sql_io.py: put_table(): unrecoverable errors: Returning default value: is_literals: Remove column rename from default value so it doesn't get treated as a column by db_xml.put() (which is handled differently from a literal value)

3685 07/30/2012 03:53 PM Aaron Marcuse-Kubitza

db_xml.py: put(): put_(): Removed no longer needed in_row_ct_ref param, which is only used by put_table(). Rewrapped function body.

3684 07/30/2012 03:46 PM Aaron Marcuse-Kubitza

sql_io.py: put_table(): ignore(): literals: Only replace invalid literal with NULL or remove row if that column actually contains the invalid value in question. This handles the case where all columns are being ignore()d because the specific column couldn't be identified, and this was not the invalid column.

3683 07/30/2012 03:02 PM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: plot: Mapped note

3682 07/30/2012 02:32 PM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: plot: Added landform mapping

3681 07/30/2012 02:24 PM Aaron Marcuse-Kubitza

schemas/vegbank.ERD.pdf: Auto-repaired with Adobe Reader so that the repair message doesn't pop up whenever it's opened

3680 07/30/2012 02:22 PM Aaron Marcuse-Kubitza

schemas: Added vegbank.ERD.pdf so the VegBank ERD is easily accessible when mapping

3679 07/30/2012 01:51 PM Aaron Marcuse-Kubitza

mappings/VegX-VegBIEN.stems.csv: project: Mapped sourceaccessioncode. This entailed adding a distinguishing suffix to the projectname input mapping.

3678 07/30/2012 01:31 PM Aaron Marcuse-Kubitza

mappings/DwC2-VegBIEN.specimens.csv, VegX-VegBIEN.stems.csv: Removed all manual mappings to datasource_id now that datasource_id is auto-populated, both on the VegBIEN output side and the DwC/VegX input side. This should greatly simplify many of the mappings!

3677 07/30/2012 12:11 PM Aaron Marcuse-Kubitza

db_xml.py: put(): Don't suppress exceptions thrown by sql_io.put_table() by passing them to on_error(), because some exceptions indicate unrecoverable database connection problems such as a broken connection, which should abort the import

3676 07/30/2012 11:52 AM Aaron Marcuse-Kubitza

db_xml.py: put(): Support datasets with no rows, where root.firstChild == None. Documented that to use an entire XML document, you need to pass root.firstChild rather than root.

3675 07/30/2012 11:31 AM Aaron Marcuse-Kubitza

inputs/import.stats.xls: Updated with stats from latest import. Note that the import now includes CVS.

3674 07/30/2012 11:23 AM Aaron Marcuse-Kubitza

README.TXT: Documented that the PostgreSQL server should be restarted after installing system updates that may affect it, to avoid spurious errors that crash the import but go away upon reimport

3673 07/27/2012 11:12 PM Aaron Marcuse-Kubitza

Regenerated vegbien.ERD exports

3672 07/27/2012 11:10 PM Aaron Marcuse-Kubitza

schemas/vegbien.ERD.mwb: Fixed lines

3671 07/27/2012 11:08 PM Aaron Marcuse-Kubitza

schemas/vegbien.ERD.mwb: Synced with schema

3670 07/27/2012 10:51 PM Aaron Marcuse-Kubitza

bin/map: Call sys.stdout.flush() after every call to sys.stdout.write() to avoid interleaved stdout/stderr output due to stdout buffering

3669 07/27/2012 10:48 PM Aaron Marcuse-Kubitza

bin/map: Call sys.stdout.flush() after every call to sys.stdout.write() to avoid interleaved stdout/stderr output due to stdout buffering

3668 07/27/2012 10:13 PM Aaron Marcuse-Kubitza

schemas/vegbien.sql: *_unique_datasource UNIQUE INDEXes: Removed COALESCE from datasource_id and datasource_id IS NOT NULL filter, because datasource_id is now always NOT NULL

3667 07/27/2012 10:07 PM Aaron Marcuse-Kubitza

schemas/filter_ERD.csv: Removed AUTO_INCREMENT because that is not added to any other tables

3666 07/27/2012 10:05 PM Aaron Marcuse-Kubitza

Regenerated schemas/vegbien.my.sql

3665 07/27/2012 10:04 PM Aaron Marcuse-Kubitza

schemas/vegbien.sql: specimenreplicate: Inherit datasource_id from taxonoccurrence instead of defining it independently

3664 07/27/2012 09:56 PM Aaron Marcuse-Kubitza

xml_func.py: Removed no longer needed local XML functions that have been translated to SQL functions

3663 07/27/2012 09:52 PM Aaron Marcuse-Kubitza

input.Makefile: Testing: Removed VegBIEN.%.xml test because the import.%.xml test output includes the template tree that it's inserting, so there is no need to generate the XML tree in a separate test. This will also remove the need to maintain local XML functions that have already been translated to DB functions for the sole purpose of this automated test.

3662 07/27/2012 09:40 PM Aaron Marcuse-Kubitza

schemas/vegbien.sql: Made datasource_id required on every table that has it, to trigger the automatic population of it by sql_io.put_table()'s col_defaults

3661 07/27/2012 09:38 PM Aaron Marcuse-Kubitza

Moved importing of col_defaults from db_xml.put_table() to bin/map, so that it also happens in row-based mode. Note that this causes a DB entry for the datasource to always be created, even if the datasource has no mappings or no rows.

3660 07/27/2012 09:13 PM Aaron Marcuse-Kubitza

Use new exc.reraise() where exc.raise_() was used, so that the stack trace is preserved when the exception is rethrown

3659 07/27/2012 09:11 PM Aaron Marcuse-Kubitza

exc.py: reraise(): Take optional exception argument so it can be invoked in the same way as raise_(). Interestingly, this missing parameter does not produce the usual "...() takes no arguments (1 given)" error when the function is called inside an except block.

3658 07/27/2012 09:04 PM Aaron Marcuse-Kubitza

exc.py: Added reraise()

3657 07/27/2012 09:02 PM Aaron Marcuse-Kubitza

db_xml.py: put(): Inserting node: Wrap sql_io.put_table() call in catch-all exception handler that calls on_error_() (wrapper for error handler provided by caller) and returns None. This both adds additional debugging info to the exception (in on_error_()) and allows recovery from arbitrary exceptions that happen in sql_io.put_table(), so that an exception does not abort the import.

3656 07/27/2012 08:50 PM Aaron Marcuse-Kubitza

exc.py: get_e_tracebacks_str(): Use the current system traceback if the exception doesn't contain its own traceback(s)

3655 07/27/2012 08:35 PM Aaron Marcuse-Kubitza

schemas/vegbien.sql: specimenreplicate: Added locationevent fkey, since fkeys are not inherited from parent tables

3654 07/27/2012 08:30 PM Aaron Marcuse-Kubitza

schemas/vegbien.sql: Added datasource_id fkey constraints to all tables that needed it

3653 07/27/2012 08:21 PM Aaron Marcuse-Kubitza

bin/map: out_is_db: Use col_defaults in row-based mode as well

3652 07/27/2012 08:02 PM Aaron Marcuse-Kubitza

db_xml.py: Renamed put_table_special_funcs to put_special_funcs because it is now used by put() as well

3651 07/27/2012 08:00 PM Aaron Marcuse-Kubitza

db_xml.py: Moved put() before the functions that use it

3650 07/27/2012 07:58 PM Aaron Marcuse-Kubitza

db_xml.py: Renamed _put_table_part() to put(), replacing the existing put() whose functionality it now performs